我有std::list<double> foo;
我正在使用
if (foo.size() >= 2){
double penultimate = *(--foo.rbegin());
}
但这总是给我一个penultimate
的任意值。
我做错了什么?
答案 0 :(得分:67)
而不是递减 rbegin
,你应该增加它,如下所示: 1
double penultimate = *++foo.rbegin();
因为rbegin()
返回反向迭代器,所以++
是在容器中向后移动的运算符。请注意,我还删掉了多余的括号:这并不是每个人的口味。
目前,您的程序的行为是 undefined ,因为您实际上已转移到end()
,并且您不能取消引用该程序。输出的任意性质是未定义行为的表现。
1 请保留您目前的最小尺寸检查。
答案 1 :(得分:26)
在我看来,最明确的方法是使用为此目的而设计的构造(C ++ 11):
double penultimate = *std::prev(foo.end(), 2)
答案 2 :(得分:11)
我会做*--(--foo.end())
;不需要反向迭代器。它也不那么令人困惑。