Рассмотрим:map.erase (map.end())?
#include <map>
int main()
{
std::map< int, int > m;
m[ 0 ] = 0;
m[ 1 ] = 1;
m.erase(0); // ok
m.erase(2); // no-op
m.erase(m.find(2)); // boom!
}
(. Хорошо, так титульных переговоры abouting стирания конца() итератора, но найти вернет конец() для несуществующего ключа)
Почему удаление Беспоставочного - существующий ключ OK, но стирание end() взрывается. Я не видел никакого явного упоминания об этом в стандарте?
Я попробовал это на VS2005 (бросает исключение в отладочной конфигурации) и GCC 4.0.1 (100% CPU). Это зависит от реализации?
Спасибо.
Чтобы уточнить: существуют различные перегрузки erase(), а для версии итератора требуется действительный элемент. – rlbond
erase (it) эквивалентно стиранию (it, ++ iterator (it)), что помогает мне видеть, что с его помощью() оно недействительно = map.end(). Вам понадобится другой итератор после .end(). –
Может ли кто-нибудь предоставить ссылку на стандарт? –