【发布时间】:2011-04-14 10:40:32
【问题描述】:
之前有几个关于这个问题的问题;我的理解是,调用 std::vector::erase 只会使位于已擦除元素 之后 位置的迭代器无效。但是,在擦除元素后,该位置的迭代器是否仍然有效(当然,前提是它在擦除后不指向end())?
我对如何实现向量的理解似乎表明迭代器绝对可用,但我不完全确定它是否会导致未定义的行为。
作为我正在谈论的示例,以下代码从向量中删除所有奇数。此代码是否会导致未定义的行为?
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;
}
代码在我的机器上运行良好,但这并不能让我相信它是有效的。
【问题讨论】: