迭代器失效中的boost :: unordered_map(Iterator invalidatio

2019-06-26 05:12发布

我使用boost::unordered_map如下

typedef boost::shared_ptr<WriterExeciter> PtrWriter;
typedef std::list<PtrWriter> PtrList; 
boost::unordered_map<std::pair<unsigned int, unsigned long long>, PtrList>  Map
Map instrMap;

现在我做一些改变类型的列表PtrList在一个循环

for(auto it = instrMap.begin(); it != instrMap.end(); ++it)
{
     auto key = it->first();
     auto list& = it->second();    
     //Make some change to an element in list 

      if(list.empty())
      {
            instMap.erase(key); 
      }



}
  1. 并在更改列表无效迭代器instrMap?

  2. 删除该元素将无效指向删除元素的迭代器。 如何修改我的代码,以便这不会导致任何问题吗? 是否使用it++而非++it帮助?

谢谢

Answer 1:

erase()操作将无效的迭代器。 然而,它也返回一个有效的迭代器的下一个元素。 所以,你可以使用类似以下内容:

for(auto it = instrMap.begin(); it != instrMap.end();)
{
     auto key = it->first();
     auto list& = it->second();    
     //Make some change to an element in list 

      if(list.empty())
      {
            it = instMap.erase(it); 
      }
      else {
            ++it;
      }
}


文章来源: Iterator invalidation in boost::unordered_map