【发布时间】:2013-05-25 11:52:10
【问题描述】:
假设我有以下代码:
typedef std::map< int, std::string >::iterator Iterator;
Iterator iter = myMap.begin();
while (iter != myMap.end())
{
Iterator current = iter;
++iter;
maybeDeleteElement( current ) // may call erase.
}
鉴于std::map 被实现为红黑树,是否保证地图中的每个元素都将被访问一次?或者修改映射会导致树重新平衡,从而改变迭代顺序?
注意:这不是关于任何迭代器是否会失效的问题。但是保持有效的迭代器并不一定意味着递增它会给您提供与之前相同的下一个元素。
【问题讨论】:
-
Iterator invalidation rules 的可能重复项
-
编辑后,这不再是上面建议的问题的重复。
-
您的示例和您标题中的问题仅略有相关。你是在问标题中的问题,还是在问你的例子?
-
一个典型的红黑树
std::map的迭代器本质上是一个指向包含某个元素的节点的指针,而不是像“从左到右的根节点”。因此,当树重新平衡时,未失效的迭代器继续指向同一元素。不过,我很难找到标准报价来证明这一切都是有保证的。
标签: c++ iterator stdmap red-black-tree