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