Инвалидация итератора в boost::unordered_map

Я использую 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?

Спасибо


person sank    schedule 12.07.2012    source источник


Ответы (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;
      }
}
person Michael Burr    schedule 12.07.2012
comment
Я заглянул в документацию. Это должно быть instMap.erase(it) вместо instMap.erase(key). Второе выражение возвращает количество стертых элементов. - person sank; 12.07.2012
comment
@sank: вы правы - это была небрежная ошибка копирования/вставки. Фиксированный. - person Michael Burr; 12.07.2012