为什么从地图中擦除操作不会使迭代器失效

Gui*_*e07 4 c++ map

我想知道为什么根据谓词从循环内的映射中进行擦除操作会将迭代器保持在valide状态,但不能用于向量

Nod*_*ode 7

Vector::erase在擦除的第一个元素之后使所有元素的迭代器无效.这是有道理的,因为向量将其数据存储在数组中.当一个元素被删除时,它之后的所有元素都需要移动,例如

int test[] = {0, 1, 2, 3, 4, 5};
                             ^
Run Code Online (Sandbox Code Playgroud)

在上面我们有一个指向值5的迭代器,我们想要它,但是,元素1被擦除,我们现在有:

0, 2, 3, 4, 5 
               ^
Run Code Online (Sandbox Code Playgroud)

迭代器指向数组的末尾,这是一个问题.

使用时std::map,数据存储在二叉树中,因此当删除元素时,某些节点的左/右指针会被修改,但它们在内存中的位置不会改变.因此,指向尚未擦除的元素的任何现有迭代器仍然有效.