以前有关于这个问题的几个问题;我的理解是,调用std::vector::erase
只会使之后位于处的迭代器无效。但是,在擦除一个元素之后,该位置上的迭代器是否仍然有效(当然,在擦除后它不指向end()
)?std ::向量迭代器失效
我对如何实现向量的理解似乎表明迭代器绝对可用,但我不完全确定它是否会导致未定义的行为。
作为我正在谈论的一个示例,下面的代码将从矢量中删除所有奇数整数。此代码是否会导致未定义的行为?
typedef std::vector<int> vectype;
vectype vec;
for (int i = 0; i < 100; ++i) vec.push_back(i);
vectype::iterator it = vec.begin();
while (it != vec.end()) {
if (*it % 2 == 1) vec.erase(it);
else ++it;
}
该代码在我的机器上运行良好,但这并不能说服我,它是有效的。
为什么你传递'通过const引用,而不是通过x'值? – fredoverflow 2010-09-20 08:13:35
@Fred:没有特别的理由;感谢您指出了这一点。 – 2010-09-20 13:21:51
@James但是上面提供的代码是如何工作的,因为擦除会使迭代器失效? – Kapil 2016-07-06 00:53:12