C++ 获取对std::list中最后两个元素的引用

C++ 获取对std::list中最后两个元素的引用,c++,c++11,reference,stl,iterator,C++,C++11,Reference,Stl,Iterator,我需要std::list中最后两个元素的别名。最后一个很简单(.back()),但是我应该如何获得它之前的一个呢 我的第一个想法是:在最后一个元素(.end())后面获得一个迭代器,并将其向左移动两次。以下是我“制作”的作品: 虽然它可以工作,但我个人觉得它有些模糊,如果我在别人的代码1中看到它,我想我不会轻易解析它 通读显示了一些其他(过于)冗长的方法2: 你更喜欢哪种方式 1I可以留下注释,但代码应该是自解释的。 2并且可能更慢更复杂,这不应该是选择的主要原因。有两个参数。您可以使用第二个:

我需要
std::list
中最后两个元素的别名。最后一个很简单(
.back()
),但是我应该如何获得它之前的一个呢

我的第一个想法是:在最后一个元素(
.end()
)后面获得一个迭代器,并将其向左移动两次。以下是我“制作”的作品:

虽然它可以工作,但我个人觉得它有些模糊,如果我在别人的代码1中看到它,我想我不会轻易解析它

通读显示了一些其他(过于)冗长的方法2:

你更喜欢哪种方式

1I可以留下注释,但代码应该是自解释的。
2并且可能更慢更复杂,这不应该是选择的主要原因。

有两个参数。您可以使用第二个:

auto& second_to_last = *std::prev(list.end(), 2);

这正是您的版本使用的
advance(iter,-2)
所做的,只是它返回结果迭代器,而不是
void
,因此您可以在一行上完成所有需要的操作。

嗯,这是我没有想到的,应该检查文档。看起来很不错。完全符合我的情况。谢谢顺便说一句,从“虽然表达式--c.end()经常编译,但不能保证会编译…”中,您可以将此添加到您的答案中。@Al.G。对于
std::list
,您不会得到一个作为指针的迭代器。@Barry好吧,可以有一个ref限定的
操作符--
。或者免费使用
迭代器&
auto iter = n.end();
std::advance(iter, -2);
&last_but_one = *iter; // this is overkill!

// weird, and the .next() variant even more
&last_but_one = *std::prev(std::prev(n.end())); 

&last_but_one = *++myList.rbegin(); // similar to *----myList.end()
auto& second_to_last = *std::prev(list.end(), 2);