所以我正在使用Accelerated C++,并且对C++中的迭代器失效有点不确定.也许这是事实,从来没有解释过如何构造这些迭代器是问题所在.
这是一个例子:
矢量与{1,2,3}
如果我的迭代器在{2}并且我在{2}上调用擦除,则我的迭代器无效.为什么?在我的脑海中,{3}向下移动,因此{2}所在的内存位置使得迭代器仍指向有效元素.我认为这不是真的唯一方法是迭代器是事先为每个元素制作的,并且每个迭代器都有某种类型的字段,其中包含该容器中以下元素的地址.
我的另一个问题与诸如"使所有其他迭代器无效"之类的语句有关.嗯,当我遍历我的矢量容器时,我正在使用一个迭代器.向量中的所有元素是否隐式地将它们自己的迭代器与它们相关联,或者我错过了什么?
在我的脑海中,{3}向下移动,因此{2}所在的内存位置使得迭代器仍指向有效元素.
这可能是这种情况.但同样有效的是整个向量都重新定位在内存中,从而使所有迭代器都指向现在已经不存在的内存位置.C++无论如何也无法保证. (请参阅评论以供讨论.)
向量中的所有元素是否隐式地将它们自己的迭代器与它们相关联,或者我错过了什么?
你只是忽略了这样一个事实:你可能有其他迭代器引用除循环变量之外的相同向量.例如,以下循环是一种惯用的样式,它缓存end向量的迭代器以避免冗余调用:
vector<int> vec;
// …
for (vector<int>::iterator i(vec.begin()), end(vec.end()); i != end; ++i) {
if (some_condition)
vec.erase(i); // invalidates `i` and `end`.
}
Run Code Online (Sandbox Code Playgroud)
(事实上,在现代编译器上,STL实际上不需要这个末端迭代器的副本这一事实.)