Dalam kode berikut ini saya loop melalui peta dan menguji apakah suatu elemen perlu dihapus. Apakah aman untuk menghapus elemen dan tetap mengulanginya atau apakah saya perlu mengumpulkan kunci di wadah lain dan melakukan putaran kedua untuk memanggil penghapusan ()?
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);
}
}
UPDATE: Tentu saja, saya kemudian membaca pertanyaan ini yang saya pikir tidak akan terkait tetapi menjawab pertanyaan saya.
std::remove_if
tidak bekerja denganstd:map
Jawaban:
C ++ 11
Ini telah diperbaiki dalam C ++ 11 (atau penghapusan telah diperbaiki / dibuat konsisten di semua jenis wadah).
Metode hapus sekarang mengembalikan iterator berikutnya.
C ++ 03
Menghapus elemen di peta tidak membatalkan iterator apa pun.
(terlepas dari iterator pada elemen yang telah dihapus)
Sebenarnya memasukkan atau menghapus tidak membatalkan iterator mana pun:
Lihat juga jawaban ini:
Teknik Tebusan Markus
Tetapi Anda perlu memperbarui kode Anda:
Dalam kode Anda, Anda menambah pm_it setelah memanggil hapus. Pada titik ini sudah terlambat dan sudah tidak valid.
sumber
pm_it++
dijamin akan dieksekusi sebelum fungsi dimasukkan?Sequence
kontainer. Properti khusus dariAssociative
wadah adalah iterator tidak disahkan dengan menghapus atau menyisipkan (kecuali jika menunjuk pada elemen yang telah dihapus). Vektor dan hapus itignators usign dibahas secara rinci dalam pertanyaan yang sesuai stackoverflow.com/a/3938847/14065Begini cara saya melakukan itu ...
sumber
Inilah yang akan saya lakukan, kira-kira:
Ada sesuatu yang aneh
tapi saya baru saja menyalinnya dari kode contoh Anda.
sumber