Rumah > pembangunan bahagian belakang > C++ > Adakah Selamat untuk Memanggil `erase()` pada Elemen Peta C Semasa Lelaran?

Adakah Selamat untuk Memanggil `erase()` pada Elemen Peta C Semasa Lelaran?

Susan Sarandon
Lepaskan: 2024-12-11 15:21:14
asal
295 orang telah melayarinya

Is it Safe to Call `erase()` on a C   Map Element During Iteration?

Akibat Memanggil padam() pada Elemen Peta Semasa Lelaran dari Mula hingga Tamat

Apabila melelaran melalui peta dalam C , adalah penting untuk mempertimbangkan implikasi daripada memanggil kaedah erase() pada elemen peta dalam gelung. Secara khusus, persoalan timbul: adakah selamat untuk memadamkan elemen dan meneruskan lelaran, atau adakah perlu untuk mengumpul kekunci dalam bekas lain dan melakukan gelung berasingan untuk pemadaman?

Dalam C 03, memadamkan elemen daripada a map tidak membatalkan mana-mana iterator kecuali mereka yang menunjuk kepada elemen yang telah dipadamkan. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kod anda mengubah suai lelaran selepas memanggil padam. Ini bermasalah kerana pm_ia menjadi tidak sah apabila pemadaman dipanggil. Untuk menangani perkara ini, anda harus menambah lelaran sebelum memanggil padam.

map<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 iterator and post-increment
    } else {
        ++pm_it;  // Can use pre-increment here for efficiency
    }
}
Salin selepas log masuk

Dalam C 11, peningkatan ketara telah dibuat untuk memadam, kerana ia kini mengembalikan lelaran seterusnya. Ini menghapuskan keperluan untuk teknik pasca kenaikan janggal yang ditunjukkan di atas. Sebaliknya, anda boleh menulis:

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;
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Adakah Selamat untuk Memanggil `erase()` pada Elemen Peta C Semasa Lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan