【问题标题】:Get references to the last two elements in std::list获取对 std::list 中最后两个元素的引用
【发布时间】: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


    【解决方案1】:

    std::prev() 接受两个参数。您可以使用第二个:

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

    这与您使用 advance(iter, -2) 的版本完全相同,只是它返回结果迭代器而不是 void,因此您可以在一行中完成所需的一切。

    【讨论】:

    • 嗯,这是我没有想到的,应该检查文档。看起来很不错。并完美地传递给我的情况。谢谢!
    • 顺便说一句,来自notes section:“虽然表达式 --c.end() 经常编译,但不能保证这样做......”您可以将其添加到您的答案中.
    • @Al.G.对于std::list<>,你不会得到一个指针的迭代器。
    • @Barry 好吧,可以有一个 ref-qualified operator--。或免费领取iterator&
    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2017-03-19
    • 2013-03-27
    • 2010-09-20
    • 2011-02-11
    相关资源
    最近更新 更多