Al.*_*.G. 4 c++ iterator stl reference c++11
我需要最后两个元素的别名std::list.最后一个是easy(.back()),但我应该如何获得它之前的那个?
我的第一个想法是:在最后一个元素(.end())之后获取一个迭代器,并将它向左移动两次.以下是我"制作"的内容:
&last_but_one = *----myList.end(),
Run Code Online (Sandbox Code Playgroud)
虽然它有效,但我个人觉得它有点混淆,如果我在别人的代码1中看到它,我认为我不会轻易解析它.
通过这个答案阅读其他一些(太)详细的方法2:
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()
Run Code Online (Sandbox Code Playgroud)
这是首选的方式?
1我可以发表评论,但代码应该是不言自明的.
2可能更慢更复杂,这不应该是选择的主要原因
Bar*_*rry 10
std::prev()有两个论点.你可以使用第二个:
auto& second_to_last = *std::prev(list.end(), 2);
Run Code Online (Sandbox Code Playgroud)
这正是你的版本advance(iter, -2)所做的,除了它返回结果迭代器而不是void你可以在一行上做你需要的一切.