Почему версия map <T>:: erase (map :: <T>iterator) для g ++ 4.0 не возвращает итератор? - PullRequest
3 голосов
/ 30 января 2009

Я портирую проект C ++ среднего размера из Visual Studio 2005 на MacOS, XCode / GCC 4.0.

Одно из различий, с которыми я только что наткнулся, связано со стиранием элемента с карты. В Visual Studio я мог стереть элемент, указанный итератором, и назначить возвращаемое значение итератору, чтобы получить позицию следующего элемента. Таким образом, итератор не будет указывать на недопустимый адрес после удаления.

Другими словами, в Visual Studio я мог бы сделать это:

itor = m_ResourceMap.erase (itor);

В GCC 4.0 функция стирания возвращает void, поэтому я не могу этого сделать. Означает ли это, что следующие элементы карты смещены на один назад, поэтому итератор автоматически указывает на следующий элемент, или это означает, что я должен увеличивать итератор впоследствии? онлайновая документация STL не очень лаконична по этому вопросу, и XCode, похоже, не имеет ее.

Спасибо за вашу помощь,

Адриан

Ответы [ 3 ]

11 голосов
/ 30 января 2009

Нет. Вы должны увеличить итератор перед удалением. Как это

m_ResourceMap.erase(itor++);

Итератор становится недействительным при удалении, поэтому вы не можете увеличивать его впоследствии.

3 голосов
/ 30 января 2009

Судя по всему, gcc следует стандарту STL, поэтому я думаю, вам придется изменить свой код.

void erase(iterator pos)     Associative Container  Erases the element pointed to by pos. 
1 голос
/ 30 января 2009

Я полагаю, что реализация DinkumWare стандартной библиотеки C ++ для реализации erase () определена так, чтобы возвращать итератор после удаляемого элемента. Это меня тоже поразило, и когда я спросил об этом DinkumWare, они сказали, что это «соответствующее расширение».

Существуют некоторые контейнеры STL (например, векторы), которые при выполнении операций вставки или удаления могут привести к недействительности всех итераторов для этого контейнера. Я не могу вспомнить, является ли карта одной из них, но, если это так, существует потенциально коварная уязвимость для вашего метода стирания элементов карты в цикле.

...