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 } }
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; } }
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!