Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取列表中倒数第二个元素?_C++_Stl_Stdlist - Fatal编程技术网

C++ 如何获取列表中倒数第二个元素?

C++ 如何获取列表中倒数第二个元素?,c++,stl,stdlist,C++,Stl,Stdlist,我有一个std::list foo 我正在使用 if (foo.size() >= 2){ double penultimate = *(--foo.rbegin()); } 但这总是给我一个倒数第二位的任意值 我做错了什么?您应该增加它,而不是减少rbegin,如下所示:1 由于rbegin()返回一个反向迭代器,因此++是在容器中向后移动的操作符。注意,我还去掉了多余的括号:这不符合每个人的口味 目前,程序的行为尚未定义,因为您实际上正在移动到end(),并且不允许取消引用。

我有一个
std::list foo

我正在使用

if (foo.size() >= 2){
    double penultimate = *(--foo.rbegin());
}
但这总是给我一个倒数第二位的任意值

我做错了什么?

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

由于
rbegin()
返回一个反向迭代器,因此
++
是在容器中向后移动的操作符。注意,我还去掉了多余的括号:这不符合每个人的口味

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



1保留当前的最小尺寸检查。

我只需执行
*--(-foo.end())
;不需要反向迭代器。在我看来,最清晰的方法是使用为此目的而设计的构造(C++11):


最后,一位新用户提出了一个写得很好的问题。投票吧!对于像我这样记不起“倒数第二”是什么意思的人来说,它意味着第二-last@MehrdadOP绝对不希望这样。特别是因为迭代器不指向任何元素。我会加上它,除非你知道你特别需要一个链表,并且能清楚地说明原因,否则永远不要使用
std::list
。首选
std::vector
。为什么可以对临时右值应用运算符+?我以为++,-,等等都是左值only@cat对于允许它的迭代器,
operator++
通常是一个成员函数,至少据我所知。没有规则规定只能对左值调用成员函数,.OP没有移动到
foo.end()
,这是一个完全有效的迭代器(尽管它不能被取消引用),而
foo.rbegin()-1
是无效的,甚至在尝试取消引用它之前也是无效的。只有当您跟上C++11中添加的所有函数时,才能清除,如果您想使代码向后不兼容,这是一个好主意;)我甚至不知道
std::prev
存在!在我看来,这绝对是最清晰的解决方案,因为它涉及最少的运算符调用,避免了对已接受答案的向后/向前混淆。C++11是6年前推出的。如果用户想要一个遗留方法,他们应该要求一个。如果你想知道(像我一样),当结束迭代器指向一个假想的结束元素时,它是两个递减。
double penultimate = *++foo.rbegin();
double penultimate = *std::prev(foo.end(), 2)