Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memadam Elemen Peta Dengan Selamat Semasa Mengulang dalam C?

Bagaimana untuk Memadam Elemen Peta Dengan Selamat Semasa Mengulang dalam C?

DDD
DDDasal
2024-12-22 21:22:11971semak imbas

How to Safely Erase Map Elements While Iterating in C  ?

Potensi Perangkap Apabila Memadam Elemen Peta Semasa Lelaran

Apabila memanipulasi peta dalam C , adalah penting untuk mempertimbangkan akibat pemadaman elemen semasa melelaran melalui mereka. Soalan ini meneroka isu yang berpotensi dan menyediakan penyelesaian untuk kedua-dua C 03 dan C 11.

C 03 Pertimbangan

Dalam C 03, memadam elemen daripada peta tidak secara automatik membatalkan semua iterator dalam peta. Walau bagaimanapun, ia tidak sah iterator yang menunjuk kepada elemen yang dipadamkan. Untuk lelaran dengan selamat melalui peta dan memadamkan elemen semasa lelaran, anda perlu menambah lelaran sebelum memanggil padam. Berikut ialah versi terkini kod yang disediakan dalam soalan:

map<string, SerialdMsg::SerialFunction_t><string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        port_map.erase(pm_it++);  // Use post-increment to get the updated iterator.
    } else {
        ++pm_it;  // Can use pre-increment for efficiency.
    }
}

Penambahan C 11

Dalam C 11, kaedah erase() telah dipertingkatkan dengan ketara. Ia kini mengembalikan iterator yang menunjuk ke elemen seterusnya dalam peta, menjadikannya selamat untuk memadamkan elemen semasa lelaran tanpa membatalkan lelaran lain. Kod yang dikemas kini menggunakan C 11 ialah:

auto pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        pm_it = port_map.erase(pm_it);
    } else {
        ++pm_it;
    }
}

Teknik Mark Ransom

Teknik Mark Ransom ialah satu lagi pilihan dalam C 03 untuk memadamkan elemen peta dengan selamat semasa lelaran . Ia melibatkan penciptaan vektor sementara untuk menyimpan kunci elemen yang akan dipadamkan dan kemudian memadamkannya dalam gelung kedua.

Kesimpulannya, apabila memadamkan elemen daripada peta semasa lelaran dalam C , ambil kira potensi pembatalan iterator dan gunakan pendekatan yang sesuai bergantung pada versi C yang anda gunakan. Ingat untuk sentiasa menambah lelaran sebelum memadamkan elemen untuk mengekalkan konsistensi dan mengelakkan tingkah laku yang tidak dijangka.

Atas ialah kandungan terperinci Bagaimana untuk Memadam Elemen Peta Dengan Selamat Semasa Mengulang dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn