【发布时间】:2010-09-08 21:45:42
【问题描述】:
std::vector<int> ints;
// ... fill ints with random values
for(std::vector<int>::iterator it = ints.begin(); it != ints.end(); )
{
if(*it < 10)
{
*it = ints.back();
ints.pop_back();
continue;
}
it++;
}
此代码不起作用,因为当调用 pop_back() 时,it 无效。但我在std::vector::pop_back() 中没有找到任何关于迭代器失效的文档。
你有相关的链接吗?
【问题讨论】:
-
您能否更详细地解释一下代码是如何失败的? pop_back 应该只使指向最后一个元素的迭代器失效,而不是全部。
-
我真的很想知道代码应该做什么?目前的意图似乎是先遍历向量,如果找到不小于 10 的值,则删除向量的最后一个元素。顺便提一句。下一个迭代器应该是
++it; -
@PauldeVrieze:当不使用评估值时,任何明智的编译器都会使
it++与++it完全相同。 -
@LightnessRacesinOrbit 在原始类型的情况下(它可能在水下)当然。但如果是运算符实现,则不能保证
++it与it++不完全不同。不是说有不同的意思就是好的风格,但语言并不能保证。 -
Iterator invalidation rules 的可能重复项