Безопасно ли увеличивать итератор внутри при использовании его в качестве аргумента? - PullRequest
1 голос
/ 02 октября 2008

В настоящее время я пытаюсь стереть последовательность итераторов из набора, однако стандартная библиотека GCC, похоже, повреждена, поскольку std :: set :: erase (iterator) должен возвращать итератор (следующий итератор), однако в GCC он возвращает пустоту (что является стандартным?)

В любом случае, я хочу написать:

myIter = mySet.erase(myIter);

Но GCC это не нравится ... Так безопасно ли писать это вместо этого?

mySet.erase(myIter++);

Редактировать: И да, я проверяю по mySet.end ();

Ответы [ 2 ]

9 голосов
/ 02 октября 2008

Нет проблем с

mySet.erase(myIter++);

Порядок операций четко определен: myIter копируется в myTempIter, myIter увеличивается, а затем myTempIter передается методу erase.

Для Грега и Марка : нет, оператор ++ не может выполнять операции после вызова стирания. По определению, функция erase () вызывается после возврата оператора ++.

3 голосов
/ 02 октября 2008

Сначала перечитайте стандарт, и вы увидите, что прототип метода set :: erase:

void erase(iterator position);

Однако ассоциативные контейнеры в STL являются «стабильными», так как стирание элемента не влияет на итераторы других элементов. Это означает, что следующая строка действительна:

iterator to_erase = myIter++;
mySet.erase(to_erase);
// Now myIter is still on the next element
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...