我需要 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 可能更慢更复杂,这不应该是选择的主要原因
最佳答案
std::prev()
有两个参数。你可以使用第二个:
auto& second_to_last = *std::prev(list.end(), 2);
这与您使用 advance(iter, -2)
的版本完全相同,只是它返回结果迭代器而不是 void
,因此您可以做任何您需要的事情在一条线上。
关于c++ - 获取对 std::list 中最后两个元素的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38445587/