Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membuang Elemen dengan Selamat dari std::vector Semasa Lelaran?

Bagaimana untuk Membuang Elemen dengan Selamat dari std::vector Semasa Lelaran?

Patricia Arquette
Patricia Arquetteasal
2024-10-30 07:35:02337semak imbas

How to Safely Remove Elements from a std::vector During Iteration?

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:

  • std::set> (tertib dan unik, disusun secara semula jadi dalam tertib menurun)
  • std::unordered_set (tidak tertib dan unik)

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:

  • Menggunakan iterator dengan berhati-hati
  • Mengekalkan dua vektor
  • Menggunakan struktur data alternatif
  • Menggunakan std::remove_if()

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!

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