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

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

Patricia Arquette
Lepaskan: 2024-10-30 07:35:02
asal
445 orang telah melayarinya

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

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

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!

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