Iterator invalidation in boost::unordered_map

boost, c++, unordered-map

Solution

The `erase()` operation will invalidate the iterator. However, it also returns a valid iterator to the next element. So you can use something like the following:

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;
      }
}

Problem

I am using `boost::unordered_map` as follows ``` 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; ``` Now I am making some changes to the list of type `PtrList` in a loop ``` 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); } } ``` Does making changes to the list invalidate the iterator to instrMap? Erasing the element will invalidate the iterator pointing to the erased element. How do I modify my code so that the this does not cause any problem? Does using `it++` instead of `++it` help? Thanks

Original source