C++ 为什么从映射中删除操作不会';无效迭代器

C++ 为什么从映射中删除操作不会';无效迭代器,c++,map,C++,Map,我想知道为什么根据谓词对循环中的映射执行擦除操作会使迭代器保持有效状态,而对向量则不然参见 Map有一个重要的特性,即在Map中插入新元素不会使指向现有元素的迭代器失效。从映射中删除元素也不会使任何迭代器失效,当然,对于实际指向正在删除的元素的迭代器除外 它实际上是一个特性。 它不会使它们无效,因为它不必这样做。对于向量,你必须这样做,因为至少所有被擦除元素的右边都会移位,指针也会改变。。。简单回答: 因为标准要求这种行为 如果您想知道如何读取树(avl、rb)(可能从链表开始) 与从列表/树中

我想知道为什么根据谓词对循环中的映射执行擦除操作会使迭代器保持有效状态,而对向量则不然参见

Map有一个重要的特性,即在Map中插入新元素不会使指向现有元素的迭代器失效。从映射中删除元素也不会使任何迭代器失效,当然,对于实际指向正在删除的元素的迭代器除外

它实际上是一个特性。 它不会使它们无效,因为它不必这样做。对于向量,你必须这样做,因为至少所有被擦除元素的右边都会移位,指针也会改变。。。简单回答:

因为标准要求这种行为

如果您想知道如何读取树(avl、rb)(可能从链表开始)

与从列表/树中删除(没有项目被移动,只有链接指针被更新)相反,您可以通过思考从向量中间删除项目(即C样式数组;后续项目被移动)时会发生什么来轻松地在脑海中描绘它


请注意,向量的遍历是安全的(通过使用顺序索引而不是迭代器),但这不是重点:迭代器接口要求增量将导致下一个有效迭代器。对于向量来说,这是不正确的(即使在实现中使用了t*的“普通”迭代器也是如此)。

vector::erase
在第一个被擦除的元素之后,使所有元素的迭代器无效。这是有意义的,因为向量将其数据存储在数组中。删除某个元素时,该元素之后的所有元素都需要移动,例如

int test[] = {0, 1, 2, 3, 4, 5};
                             ^
在上面的例子中,我们有一个迭代器,它指向我们想要的值5,但是,如果元素1被删除,我们现在就有:

0, 2, 3, 4, 5 
               ^
迭代器指向数组的末尾,这是一个问题


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

erm。。。因为标准规定它必须符合这种行为。如果您想知道如何读取树(avl,rb)(可能从链表开始)。我认为您的示例通过删除最后一个元素来歪曲事实。从数组中间删除一个元素也是一样的(因为(假设使用微不足道的指针迭代器)违反了可达性保证(您可能会意外地跳过下一项)此外,允许使用非平凡的迭代器类型,例如用于调试,并且这些允许在从向量中删除之后调用更多未定义的行为)@ SEHE,我选择最后一个元素来构造一个简单易懂的例子,但这是中间元素的一个好点。