为什么在C++中调用'erase()'后'iterator object'就失效了?

In C++, why the 'iterator object' becomes invalid after calling 'erase()'?

我知道'grammatical why'。

我想知道的是,'techincal why'。

据我所知,'iterator object' 是模仿 'pointer'。

如果它真的模仿 'pointer',它应该 'point' 容器中的擦除索引。

就像,如果一个向量包含

index 0  1  2  3  4
val   10 20 30 40 50

vector<int>iterator iter = veciter.begin();
++iter;
veciter.erase(iter);

那么 'iter' 应该 'point' 'index 1' 如果 'iterator object' 真的模仿 'pointer'.

但事实并非如此。

为什么?

目的是什么?

If it really mimics 'pointer', it should 'point' the erased index in the container.

这个推论对我来说没有意义。指针是数组的迭代器。无法从数组中擦除元素,因此它们不能用作迭代器在擦除时应如何表现的示例。

即使推论适用,您也需要了解迭代器是指针的泛化。所有迭代器共有的特征的交集是指针特征的子集。假设所有迭代器在各方面的行为都与指针相同是不合理的。


why the 'iterator object' becomes invalid after calling 'erase()'?

因为这是对所有迭代器有效实施的唯一选项。


此外,迭代器是一个抽象的概念。尽量忘掉关于指针的一切,专注于迭代器的以下抽象描述:它是一个引用实体的对象,你可以间接通过它(如果引用有效实体)得到一个对象,你可以增加它来移动到下一个实体(如果有下一个实体)。

如果我指的是某个东西,并且当所指的实体不再存在时,您是否直觉地认为我突然指的是其他实体?如果我在原始实体被销毁后间接通过迭代器访问被销毁的实体,那么这是一个逻辑错误。获得一些其他对象并不能改善这种情况。不幸的是,也没有一种有效的方法来检查这个错误,所以它很容易被认为是“未定义的行为”。

由于实现不受标准的约束 return 另一个对象,而是可以自由地做任何事情,它可能会尝试提供帮助并在需要时检测错误(但你不能依赖它),或者它可能会在需要效率时跳过所有检查,在这种情况下,错误可能会导致程序崩溃和燃烧(如果你幸运的话)。