Mengalih keluar Elemen daripada std::Vector Semasa Lelaran
Apabila anda mempunyai vektor elemen dan perlu mengalih keluar item semasa melelaran melaluinya , kaedah erase() boleh menyebabkan kesukaran. Memadamkan elemen membatalkan semua iterator yang menunjuk ke elemen berikutnya.
Iterators dan erase()
Pertimbangkan kod berikut:
<code class="cpp">std::vector<std::string> m_vPaths; ... for (auto iter = m_vPaths.begin(); iter != m_vPaths.end(); iter++) { std::string strPath = *iter; if (::DeleteFile(strPath.c_str())) { m_vPaths.erase(iter); // Iterators become invalid after erase } }</code>
Selepas pemadaman fail pertama berjaya, iterator yang menunjuk ke elemen seterusnya menjadi tidak sah. Ini merumitkan kesinambungan lelaran.
Menggunakan Dua Vektor
Satu penyelesaian ialah menggunakan dua vektor: satu untuk berulang dan satu lagi untuk menyimpan elemen yang akan dipadamkan . Semasa ini berfungsi, ia memperkenalkan overhed dan kerumitan memori tambahan.
Struktur Data Alternatif
Terdapat struktur data yang lebih sesuai untuk mengalih keluar elemen semasa lelaran, seperti:
Struktur ini mengekalkan koleksi nilai yang diisih atau tidak tertib dan pengalihan keluar tidak membatalkan elemen lain.
Menggunakan std::remove_if
Sebagai alternatif, anda boleh menggunakan algoritma std::remove_if() untuk mengalih keluar elemen tertentu daripada vektor sebelum memadamkannya. Ini memastikan bahawa iterator kekal sah:
<code class="cpp">auto iter_new_end = std::remove_if(m_vPaths.begin(), m_vPaths.end(), [](const std::string& strPath) { return ::DeleteFile(strPath.c_str()); }); m_vPaths.erase(iter_new_end, m_vPaths.end());</code>
Kesimpulan
Bergantung pada keperluan khusus anda, anda boleh memilih pendekatan terbaik daripada:
Atas ialah kandungan terperinci Bagaimana untuk Membuang Elemen dengan Selamat dari std::vector Semasa Lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!