Правильно ли проходить через 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. Хотя в принципе все нормально.