考虑在迭代时从关联容器中删除元素的规范算法:
for (auto iter = myMap.begin(); iter != myMap.end(); )
{
if (/* removal condition */)
{
iter = myMap.erase(iter);
}
else
{
++iter;
}
}
在使用C ++ 11 std::unordered_map
容器时,我一直在不加思索地应用此算法。但是,在cppreference.com上浏览std::unordered_map::erase
的文档后,在阅读以下注释后我变得有点担心:
保留未被删除元素的顺序(这样可以在迭代容器时删除单个元素)(自C ++ 14开始)
基于此声明,我假设在C ++ 14标准中添加了语言,以确保库实现者在调用std::unordered_map::erase
后保证排序。例如,也许这样的要求会限制实现在删除元素后不重新整理整个容器,而只允许它从相应的存储桶中删除元素?
如果没有C ++ 11中的这样的保证,并且如果我希望我的代码可移植,我是否必须担心如果我从{{1中删除一个元素,将会多次访问某些元素或根本不访问在迭代期间?
答案 0 :(得分:2)
编辑: NoScript的危险。我运行了noscript,它将C11和C14标签显示为一个框。 Praetorian的答案是正确的,它在实践中得到了保证,并在c14中正式确定。
** 由于noscript,以下是错误的。
在cplusplus的底部,它表示
只有迭代器和对删除的元素的引用才会失效。
其余的不受影响。
保留未被操作删除的元素的相对迭代顺序。
http://www.cplusplus.com/reference/unordered_map/unordered_map/erase/
在页面的顶部,它声明它适用于C ++ 11 ...所以除非他们为C ++ 14更新它,我认为它也适用于C ++ 11。 Praetorian应该给出答案,你应该检查他的答案,因为即使在C ++ 11的标准中没有保证(C ++ 14是这类东西的补丁),它在实践中得到了保证。
我找不到STL标准,我似乎放错了地方,或者我会去看看是否有文字保证我可以指出。 : - /