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