【发布时间】:2016-07-18 20:35:37
【问题描述】:
我需要std::list 中最后两个元素的别名。最后一个很简单(.back()),但是前面那个怎么弄呢?
我的第一个想法是:在最后一个元素 (.end()) 之后获取一个迭代器并将其向左移动两次。这是我“制作”的:
&last_but_one = *----myList.end(),
虽然它有效,但我个人觉得它有些混淆,如果我在别人的代码中看到它,我认为我不会轻易解析它1。
通读this answer 显示了一些其他(太)冗长的方法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()
这样做的首选方式是什么?
1我可以发表评论,但代码应该是不言自明的。
2而且可能更慢更复杂,这不应该是主要原因供选择
【问题讨论】:
标签: c++ c++11 reference stl iterator