c++ - 为什么 std::vector 迭代器在 erase() 调用后失效?

标签 c++ c++11 vector stl iterator

C++ 引用明确指出,在迭代器上调用 std::vector::erase(it)使指向和之后指向被删除元素的所有迭代器失效http://en.cppreference.com/w/cpp/container/vector/erase

我确实理解为什么这样的迭代器在 erase 调用后变得不可取消引用,但我很好奇为什么它们需要变得无效,需要哪些实现细节?

例如,标准规定 std::vector 必须使用连续存储的元素来实现,元素不仅可以通过迭代器访问,还可以使用指向元素的常规指针的偏移量 因此,此类容器的迭代器可能会实现为指针似乎合乎逻辑 - 但指针如何变得无效?

最佳答案

构建迭代器 概念的原则之一如下:只要迭代器保持非别名、可解引用和非修改,它就应该引用同一个实体.换句话说,多次取消引用同一个迭代器应该产生相同的值。使用迭代器的算法可能依赖于它。

您提出的建议将导致迭代器“神奇地”更改其引用的值,即使迭代器本身保持不变。这在迭代器的概念思想中是 Not Acceptable 。


转念一想,我上面所说的显然有缺陷,因为我们总是可以对移动元素的 vector 应用一些修改操作(例如 std::random_shuffle)。这样的操作不会使任何迭代器失效,但会很容易地改变迭代器引用的值。这与 erase 触发的元素移动有何不同?它不是。

关于c++ - 为什么 std::vector 迭代器在 erase() 调用后失效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40899608/

相关文章:

c++ - 抛出类似函数的可变参数宏包装,替换抛出的异常

c++ - 文件编码如何影响 C++11 字符串文字?

c++ - 在 C++ 中循环合法的相同 vector

c++ - 是否 = 在 lambda 的捕获列表中捕获 this 指针

充满抽象对象的 C++ 容器

C++ 类模板构造函数继承与指针

c++ - 使用 std::vector.push_back() 时出现错误 C2280

c++ - 访问父类的成员 "Invalid use of non-static data member"C++

C++ Xcode 不会运行我的 for 循环(非常短)

c++ - 成员未在范围内声明?