我对迭代器感到困惑:
vector<int> v;
auto begin = v.begin(), end = v.end();
while (begin != end)
{
begin = v.insert(begin, 4);
begin++;
}
结束迭代器无效,循环无法停止。我不知道为什么,因为最终迭代器在初始化后没有被更改。此外,为了方便起见,我曾经将迭代器视为指针。
答案 0 :(得分:0)
This question列出了迭代器失效规则。通过调整大小(“按插入/删除[23.2.4.2/6]”)修改数据结构会使迭代器失效,甚至会使您注意到end()
。
答案 1 :(得分:0)
来自http://en.cppreference.com/w/cpp/container/vector/insert
如果新
size()
大于旧capacity()
,则会导致重新分配。如果新size()
大于capacity()
,则所有迭代器和引用都将失效。否则,只有插入点之前的迭代器和引用仍然有效。过去的迭代器也会失效。
在您的情况下,调用v.insert(begin, 4)
使所有迭代器无效,因为向量是空的,以便开始。
作为防御性编码策略,最好不要在调用insert()
后依赖任何迭代器。
答案 2 :(得分:0)
首先。 STL迭代器与指针一样不安全。无论好坏,就是这样。我们无法改变这一点。这意味着在使用迭代器时需要小心。
现在幕后发生了什么。两个迭代器本质上都是指针。第一个指向矢量体的当前开始,第二个指向矢量体的当前结束。在插入期间,允许向量移动向量的主体到其他地方。如果vector将移动主体,则迭代器end
将继续指向同一位置。即使向量不会移动向量的开头(有时会发生这种情况),你的迭代器也会指向最后一个有效元素(不是在最后一个有效元素之后,正常情况下应该如此)。再一次,这不是你所期望的。
上面所写的只是为了理解。你永远不应该使用这些知识。您应该检查哪些操作使哪些类型的迭代器无效,并且仅根据文档中明确允许的内容创建代码。