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

标签 c++ c++11 reference stl iterator

我需要 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/

相关文章:

C++ 对命名空间 Visual Studio Code 的 undefined reference

C++ - 捕获双重异常

c++ - 如何以编程方式禁用插件

c++ - Newb C++类问题

c++ - 使用 {} 的函数重载解析

c++ - Clang 输出错误 "no matching construct for initialization"

c++ - 默认的默认构造函数?在 n3290 草案中

c++ - 在多个头文件中拆分类是否可以?

php - 在 PHP 中使用 Jquery 时如何编写查询代码

azure - 在 Azure 中创建路由时,如何在 Terraform 中引用防火墙专用 IP 地址