C ++ 11:在迭代时从std :: unordered_map中删除单个元素是否安全?

时间:2014-07-30 21:24:37

标签: c++ c++11 stl iterator unordered-map

考虑在迭代时从关联容器中删除元素的规范算法:

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中删除一个元素,将会多次访问某些元素或根本不访问在迭代期间?

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标准,我似乎放错了地方,或者我会去看看是否有文字保证我可以指出。 : - /