考虑在迭代过程中从关联式容器中移除元素的规范算法:
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中的这种保证,并且如果我希望我的代码可移植,那么我必须担心如果我在遍历过程中从一个std::unordered_map
中删除一个元素,某些元素是否会被访问多次或根本不被访问?
map::erase
返回一个迭代器。我一直记得Effective STL中的模式:if( ) myMap.erase(it++); else ++it;
但是你的更好。 - TemplateRex