我有一个 std::list<double> foo;
我正在使用
if (foo.size() >= 2){
double penultimate = *(--foo.rbegin());
}
但这总是给我一个任意值penultimate
。
我究竟做错了什么?
我有一个 std::list<double> foo;
我正在使用
if (foo.size() >= 2){
double penultimate = *(--foo.rbegin());
}
但这总是给我一个任意值penultimate
。
我究竟做错了什么?
std::list
。更喜欢std::vector
。
Answers:
而不是减少 rbegin
,您应该增加它,如下所示:1
double penultimate = *++foo.rbegin();
asrbegin()
返回反向迭代器,++
操作员也将在容器中向后移动。请注意,我也删除了多余的括号:这并不符合每个人的口味。
当前,您的程序的行为是不确定的,因为您实际上是在迁移到end()
,因此您不能取消引用它。输出的任意性质是这种不确定行为的体现。
1确保保留当前的最小尺寸检查。
operator++
通常至少是我所知的成员函数。没有规则说明成员函数只能在左值上调用,除非成员函数被ref限定为&
。
foo.end()
哪一个是完全有效的迭代器(尽管无法取消引用),而是foo.rbegin()-1
无效的,甚至在尝试取消引用之前也是如此。
在我看来,最清晰的方法是使用为此目的而设计的构造(C ++ 11):
double penultimate = *std::prev(foo.end(), 2)
std::prev
存在!