Próbuję dowiedzieć się, jak działają iteratory std::multimap
, dlatego stworzyłem prosty przykład, który pokazuje istotę mojego problemu. W przypadku odkomentowania 1, oczekuję, że iterator wskaże pierwszy element z kluczem 1, ale w rzeczywistości wypisze wszystkie wartości związane z kluczem 0 (jak nic nie zostało usunięte), a czasami zawiesza się, prawdopodobnie dlatego, że iterator jest nieprawidłowy. Jednak w przypadku odkomentowania 2 wszystkie wartości klucza 1 są poprawnie usuwane.C++ wielokrotnego iteratora unieważnienia
Czy istnieje jakiś sposób sprawdzenia, jaki jest następny ważny iterator dla multimap
po usunięciu? (np std::vector.erase(...)
powraca jeden)
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' "dlaczego nie" to-> pierwsze "? – curiousguy
Czy to naprawdę ważne? osiąga to samo i jestem w 95% pewien, że skompiluje się do tego samego kodu. –
@combinator, ponieważ lubię pisać (* it) .first. – givi