如何在列表中获得倒数第二个元素?

Pau*_*gue 69 c++ stl stdlist

我有一个 std::list<double> foo;

我正在使用

if (foo.size() >= 2){
    double penultimate = *(--foo.rbegin());
}
Run Code Online (Sandbox Code Playgroud)

但这总是给我任意的价值penultimate.

我究竟做错了什么?

Bat*_*eba 67

你应该增加它,而不是递减 rbegin,如下所示:1

double penultimate = *++foo.rbegin();
Run Code Online (Sandbox Code Playgroud)

as rbegin()返回一个反向迭代器,++操作符也在容器中向后移动.请注意,我还删掉了多余的括号:这并不是每个人的口味.

目前您的程序的行为是未定义的,因为您实际上正在移动end(),并且您不允许取消引用该程序.输出的任意性质是未定义行为的表现.


1请保留您当前拥有的最小尺寸检查.


Gre*_*rie 27

在我看来,最明确的方法是使用为此目的而设计的构造(C++ 11):

double penultimate = *std::prev(foo.end(), 2)
Run Code Online (Sandbox Code Playgroud)

  • C++ 11 6年前问世.如果用户想要传统方法,他们应该要求一个. (4认同)

Meh*_*dad 11

我会做的*--(--foo.end()); 不需要反向迭代器.它也不那么混乱了.

  • 如果你想知道(就像我做的那样),它就是两个减量,因为结束迭代器指向一个想象的过去结束元素. (3认同)