插入后矢量迭代器失效

时间:2016-01-25 04:35:37

标签: c++

我对迭代器感到困惑:

vector<int> v;
auto begin = v.begin(), end = v.end();
while (begin != end)
{
    begin = v.insert(begin, 4);
    begin++;
}

结束迭代器无效,循环无法停止。我不知道为什么,因为最终迭代器在初始化后没有被更改。此外,为了方便起见,我曾经将迭代器视为指针。

3 个答案:

答案 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将继续指向同一位置。即使向量不会移动向量的开头(有时会发生这种情况),你的迭代器也会指向最后一个有效元素(不是在最后一个有效元素之后,正常情况下应该如此)。再一次,这不是你所期望的。

上面所写的只是为了理解。你永远不应该使用这些知识。您应该检查哪些操作使哪些类型的迭代器无效,并且仅根据文档中明确允许的内容创建代码。