如何获取列表中的倒数第二个元素?
How can I get the penultimate element in a list?
我有一个std::list<double> foo;
我正在使用
if (foo.size() >= 2){
double penultimate = *(--foo.rbegin());
}
但这总是给我一个任意值penultimate
。
我做错了什么?
而不是递减 rbegin
,您应该递增它,如下所示:1
double penultimate = *++foo.rbegin();
作为rbegin()
returns一个反向迭代器,所以++
是容器中向后移动的运算符。请注意,我还删除了多余的括号:这不符合每个人的口味。
目前您的程序的行为是未定义,因为您实际上正在移动到end()
,并且不允许取消引用它。输出的任意性是这种未定义行为的表现。
1请保留您当前拥有的最小尺寸检查。
我会做*--(--foo.end())
;不需要反向迭代器。它也不那么令人困惑了。
在我看来,最明确的方法是使用为此目的设计的结构 (C++11):
double penultimate = *std::prev(foo.end(), 2)
我有一个std::list<double> foo;
我正在使用
if (foo.size() >= 2){
double penultimate = *(--foo.rbegin());
}
但这总是给我一个任意值penultimate
。
我做错了什么?
而不是递减 rbegin
,您应该递增它,如下所示:1
double penultimate = *++foo.rbegin();
作为rbegin()
returns一个反向迭代器,所以++
是容器中向后移动的运算符。请注意,我还删除了多余的括号:这不符合每个人的口味。
目前您的程序的行为是未定义,因为您实际上正在移动到end()
,并且不允许取消引用它。输出的任意性是这种未定义行为的表现。
1请保留您当前拥有的最小尺寸检查。
我会做*--(--foo.end())
;不需要反向迭代器。它也不那么令人困惑了。
在我看来,最明确的方法是使用为此目的设计的结构 (C++11):
double penultimate = *std::prev(foo.end(), 2)