Безопасно ли увеличивать итератор внутри при использовании его в качестве аргумента?
Вопрос
В настоящее время я пытаюсь стереть последовательность итераторов из набора, однако стандартная библиотека GCC, похоже, не работает, потому что std::set::erase(iterator) должен возвращать итератор (следующий итератор), однако в GCC он возвращает void (какой стандарт?)
В любом случае я хочу написать:
myIter = mySet.erase(myIter);
Но GCC это не нравится...Так безопасно ли писать это вместо этого?
mySet.erase(myIter++);
Редактировать:И да, я проверяю mySet.end();
Решение
Нет проблем с
mySet.erase(myIter++);
Порядок действий четко определен:myIter копируется в myTempIter, myIter увеличивается, а затем myTempIter передается методу стирания.
Для Грега и Марка:нет, оператор++ не может выполнять операции после вызова стирания.По определению, метод Erase() вызывается после возврата оператора++.
Другие советы
Во-первых, перечитайте стандарт, и вы увидите, что прототип метода set::erase:
void erase(iterator position);
Однако ассоциативные контейнеры в STL являются «стабильными», поскольку стирание элемента не влияет на итераторы других элементов.Это означает, что следующая строка действительна:
iterator to_erase = myIter++;
mySet.erase(to_erase);
// Now myIter is still on the next element