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/