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在迭代期间删除一个元素,我是否必须担心一些元素会被访问多次或根本不访问?
编辑: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标准,我似乎把它放错地方了,或者我会去看看是否有一个文本保证我可以指出。:-/