Правильно ли проходить через QMap с итераторами и стирать / добавлять элементы?

правильно ли последовательно ходить по QMap с помощью итераторов и делать такие действия: удалять некоторые элементы и добавлять новые?

например:

for( QMap<key_t,val_t>::iterator it = map.begin();
     it != map.end();
     ++it )
{
     if( it->value == something )
     {
          map.erase(it);
          map.insert(it->key+10,it->value); 
     } 
}

кажется, что ничего плохого не будет сделано, я прошу быть уверенным. (У меня нет времени, чтобы проверить это).

UPD решит с QMap::unite():

for( QMap<key_t,val_t>::iterator it = map.begin();
     it != map.end();
     ++it )
{
     if( it->value == something )
     {
          tmp_map.insert(it->key+10,it->value); 
          map.erase(it);
     } 
}
map.unite(tmp_map);

Спасибо за ответы!

4 ответов


подумайте об этом немного... Вы повторяете коллекцию, удаляя элемент посередине и добавляя другой элемент где-то еще. Будут ли итераторы по-прежнему правильными? Будет ли" следующий " итератор действительно следующим элементом?

В общем, это не очень хорошая идея, чтобы изменить коллекцию, которую вы повторяете. Если необходимо использовать временную коллекцию и скопировать выбранные элементы в нее, очистите реальную коллекцию и переместите элементы из временной коллекции более реальной.

в вашем случае, почему бы не использовать QMap::find искать something, и если найдено, удалите его и добавьте новый элемент, и сделайте это в цикле, пока something больше не нашли?


итератор будет признан недействительным erase, и поэтому не может безопасно использоваться или впоследствии увеличивается. Должно работать следующее:

for( QMap<key_t,val_t>::iterator it = map.begin(); it != map.end(); ) 
{
    if( it->value == something ) 
    {
        map.insert(it.key()+10,it.value()); 
        it = map.erase(it);
    } else {
        ++it;
    }
}

Я бы ожидал it недействительным после map.erase(it) в этом случае it->value и ++it не будет работать.


вы должны "сбросить" свой итератор на тот, который возвращается erase и insert. Хотя в принципе все нормально.