W poniższym kodzie wykonuję pętlę przez mapę i sprawdzam, czy element musi zostać usunięty. Czy można bezpiecznie wymazać element i kontynuować iterację, czy też muszę zebrać klucze w innym kontenerze i wykonać drugą pętlę, aby wywołać funkcję erase ()?
map<string, SerialdMsg::SerialFunction_t>::iterator pm_it;
for (pm_it = port_map.begin(); pm_it != port_map.end(); pm_it++)
{
if (pm_it->second == delete_this_id) {
port_map.erase(pm_it->first);
}
}
AKTUALIZACJA: Oczywiście przeczytałem wtedy to pytanie, które nie wydawało mi się powiązane, ale odpowiada na moje pytanie.
std::remove_if
nie działa zstd:map
Odpowiedzi:
C ++ 11
Zostało to naprawione w C ++ 11 (lub wymazywanie zostało ulepszone / ujednolicone we wszystkich typach kontenerów).
Metoda erase zwraca teraz następny iterator.
C ++ 03
Wymazywanie elementów na mapie nie unieważnia żadnych iteratorów.
(oprócz iteratorów na usuniętym elemencie)
W rzeczywistości wstawianie lub usuwanie nie unieważnia żadnego z iteratorów:
Zobacz także odpowiedź:
Technika oznaczania okupu
Ale musisz zaktualizować swój kod: w
swoim kodzie zwiększasz wartość pm_it po wywołaniu funkcji erase. W tym momencie jest już za późno i jest już unieważniony.
źródło
pm_it++
gwarantowana przed wprowadzeniem funkcji?Sequence
kontenerów. Specjalną właściwościąAssociative
kontenerów jest to, że iteratory nie są unieważniane przez wymazywanie lub wstawianie (chyba że wskazują na element, który został usunięty). Iteratory wektorów i wymazywania są szczegółowo omówione w odpowiednim pytaniu stackoverflow.com/a/3938847/14065Oto jak to robię ...
źródło
Tak bym to zrobił, w przybliżeniu:
Jest w tym coś dziwnego
ale właśnie skopiowałem to z twojego przykładowego kodu.
źródło