Apabila melelaran pada std::vector dan melakukan tindakan yang memerlukan pengubahsuaian saiz vektor, seperti memadam elemen, anda mungkin menghadapi isu ketidaksahihan iterator. Ini kerana kaedah erase() yang digunakan untuk mengalih keluar elemen mengubah saiz vektor dan membatalkan semua iterator yang sedia ada.
Untuk mengatasinya, penyelesaian yang cekap ialah menggunakan nilai pulangan daripada kaedah erase(), yang menyediakan lelaran baharu yang sah menunjuk kepada elemen serta-merta selepas yang dipadamkan. Ini membolehkan anda meneruskan lelaran tanpa perlu risau tentang iterator yang tidak sah.
Kod berikut menunjukkan pendekatan ini:
<code class="cpp">std::vector<std::string>::iterator iter; for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) { if (::DeleteFile(iter->c_str())) { iter = m_vPaths.erase(iter); // Returns a new valid iterator } else { ++iter; // Advance iterator if file deletion failed } }</code>
Dalam kod ini, iterator iter dikemas kini untuk menunjuk ke elemen seterusnya selepas setiap pemadaman fail yang berjaya, membolehkan lelaran diteruskan dengan lancar.
Walaupun menggunakan pendekatan iterator adalah cekap, ia masih mengubah suai vektor m_vPaths asal, yang mungkin mempunyai prestasi implikasi jika anda perlu membuat beberapa pemadaman. Dalam kes sedemikian, mungkin lebih baik untuk mempertimbangkan menggunakan struktur data alternatif yang dioptimumkan untuk memadamkan elemen dengan cekap, seperti:
Atas ialah kandungan terperinci Bagaimana untuk Mengeluarkan Elemen dengan Cekap dari std::vector Semasa Lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!