【发布时间】:2020-08-18 06:27:20
【问题描述】:
我需要遍历 std::list 持有 2 个最后一个值,即如果我的列表是 [1,2,3,4,5,6]
iteration1 : v1 = 1, v2 = 2
iteration2 : v1 = 2, v2 = 3
iteration3 : v1 = 3, v2 = 4
iteration4 : v1 = 4, v2 = 5
iteration5 : v1 = 5, v2 = 6
我试过
auto next = _contour.begin();
auto prev = next;
while( next != _contour.end())
{
prev = next;
next++;
}
但效果不好——遍历结束时出现问题。在最后一次迭代中,next 指向列表之外。
如何在每次迭代检查next 时以我不希望的良好性能正确执行此操作?
【问题讨论】:
-
我认为代码是正确的。你确实检查了
next!= _contour.end(),所以它不应该超过。 -
我猜真正的工作是在
next++行之后完成的,并且next可以等于.end()。 -
问题中的代码肯定不正确。无论 OP 将实际循环体放在哪里,它都不会做正确的事情。
-
您不能不检查每次迭代,因为列表可能会在每次迭代时结束。您可以展开循环以增加一点性能,但您拥有的代码是标准的。
-
@Evg 这个gcc.godbolt.org/z/sqzPeM