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

f11*_*994 19 c++ iterator stl unordered-map c++11

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

for (auto iter = myMap.begin(); iter != myMap.end(); )
{
    if (/* removal condition */)
    {
        iter = myMap.erase(iter);
    }
    else
    {
        ++iter;
    }
}
Run Code Online (Sandbox Code Playgroud)

在使用C++ 11 std::unordered_map容器时,我一直在不加思索地应用这个算法.但是,在浏览cppreference.comstd::unordered_map::erase上的文档之后,在阅读以下注释后我变得有点担心:

保留未擦除元素的顺序(这使得可以在迭代容器时擦除单个元素)(从C++ 14开始)

基于这个陈述,我假设在C++ 14标准中添加了语言,以确保库实现者在调用后保证排序std::unordered_map::erase.例如,这样的要求可能会限制实现在删除元素后不重新整理整个容器,而只是允许它从相应的存储桶中删除元素?

如果我在C++ 11中没有这样的保证,并且如果我希望我的代码是可移植的,那么如果我std::unordered_map在迭代期间删除一个元素,我是否必须担心一些元素会被访问多次或根本不访问?

Cal*_*ain 2

编辑:NoScript 的危险。 我没有运行脚本,它将 C11 和 C14 选项卡显示为一个框。Praetorian 的答案是正确的,它在实践中得到保证,并在 c14 中正式化。

**由于没有脚本,以下内容是错误的。

在 cplusplus 的底部它指出

只有迭代器和对已删除元素的引用才会失效。

其余的不受影响。

未被操作移除的元素的迭代的相对顺序被保留。

http://www.cplusplus.com/reference/unordered_map/unordered_map/erase/

在页面顶部,它声明它适用于 C++11...所以除非他们将其更新为 C++14,否则我认为它也适用于 C++11。Praetorian 应该给出一个答案,你应该检查他的答案,因为即使在 C++11 标准中不能保证这一点(C++14 是这类事情的补丁),但在实践中它是有保证的。

我找不到STL标准,我似乎把它放错地方了,或者我会去看看是否有一个文本保证我可以指出。:-/