Безопасно ли увеличивать итератор внутри при использовании его в качестве аргумента?

StackOverflow https://stackoverflow.com/questions/161166

  •  03-07-2019
  •  | 
  •  

Вопрос

В настоящее время я пытаюсь стереть последовательность итераторов из набора, однако стандартная библиотека 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top