4

我使用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帮助?

谢谢

4

1 回答 1

5

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;
      }
}
于 2012-07-12T00:36:13.573 回答