Я пытаюсь выяснить, как работают итераторы std::multimap
, поэтому я создал простой пример, который показывает суть моей проблемы. Если uncomment case 1, я ожидаю, что итератор укажет на первый элемент с ключом 1, но на самом деле он печатает все значения, связанные с ключом 0 (например, ничего не было удалено), а иногда он сбой, вероятно, потому, что итератор недействителен. Однако, если раскол 2, все значения с ключом 1 удаляются должным образом.C++ multimap iterator invalidation
Есть ли способ узнать, что является следующим действительным итератором для multimap
после стирания? (например std::vector.erase(...)
возвращает один)
std::multimap<int, int> m;
for(int j=0; j<3; ++j) {
for(int i=0; i<5; ++i) {
m.insert(std::make_pair(j, i));
}
}
for(std::multimap<int, int>::iterator it=m.begin(); it!=m.end();) {
printf("%d %d\n", (*it).first, (*it).second);
++it;
if((*it).second == 3) {
//m.erase(0); //case 1
m.erase(1); //case 2
}
}
«' (* it) .first'' почему не 'it-> first'? – curiousguy
Действительно ли это имеет значение? он выполняет то же самое, и я уверен, что 95% он будет скомпилирован с тем же кодом. –
@curiousguy cause Мне нравится писать (* it) .first. – givi