Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengulang dan Mengeluarkan Elemen dengan Selamat dari senarai std::?

Bagaimana untuk Mengulang dan Mengeluarkan Elemen dengan Selamat dari senarai std::?

Patricia Arquette
Lepaskan: 2025-01-04 15:31:40
asal
515 orang telah melayarinya

How to Safely Iterate and Remove Elements from a std::list?

Mengulang dan Mengalih Keluar Elemen daripada std::list

Mengalih keluar elemen daripada std::list semasa mengulanginya memerlukan pengendalian yang teliti untuk elakkan tidak sah iterator. Satu salah tanggapan yang lazim ialah mengandaikan bahawa mengalih keluar elemen sejurus selepas penilaiannya akan meningkatkan lelaran dengan betul. Walau bagaimanapun, pendekatan ini membawa kepada ralat "List iterator not incrementable".

Memahami Gelagat Iterator

Dalam std::list, elemen diperuntukkan secara bersebelahan. Apabila elemen dialih keluar, elemen seterusnya beralih untuk mengisi ruang kosong. Akibatnya, iterator pada mulanya menunjuk kepada elemen yang dialih keluar menjadi tidak sah. Menaikkan lelaran ini akan menyebabkan gelagat yang tidak ditentukan.

Pendekatan Betul: Naik Dahulu, Buang Kemudian

Untuk mengalih keluar elemen dengan betul semasa mengulang, pakai strategi berikut:

  1. Naikkan iterator dahulu: Gunakan i untuk mengalihkan iterator ke elemen seterusnya sebelum mengalih keluar apa-apa.
  2. Alih keluar elemen sebelumnya: Gunakan item.erase(i ) untuk mengalih keluar elemen yang berada sebelum kedudukan semasa, di mana saya mengembalikan lelaran ke seterusnya unsur. Sebagai alternatif, anda boleh menggunakan i = items.erase(i); untuk mencapai hasil yang sama.

Kod Diubah Suai Menggunakan Gelung Sementara:

std::list<item*>::iterator i = items.begin();
while (i != items.end()) {
    bool isActive = (*i)->update();
    if (!isActive) {
        items.erase(i++);  // alternatively, i = items.erase(i);
    } else {
        other_code_involving(*i);
        ++i;
    }
}
Salin selepas log masuk

Kod yang diubah suai ini berulang melalui senarai dan:

  1. Kemas kini panggilan() pada setiap item.
  2. Jika item tidak aktif, alih keluar dan mengalihkan lelaran ke elemen seterusnya.
  3. Jika item itu aktif, laksanakan kod lain dan tambahkan lelaran.

Mengelakkan Pendekatan Remove_if

Kod asal anda termasuk panggilan remove_if() selepas gelung. Pendekatan ini biasanya tidak digalakkan dalam konteks ini kerana ia memerlukan lulus tambahan ke atas senarai. Lelaran dan pengalihan keluar dalam satu laluan, seperti yang ditunjukkan di atas, ialah penyelesaian yang lebih cekap dan mudah.

Atas ialah kandungan terperinci Bagaimana untuk Mengulang dan Mengeluarkan Elemen dengan Selamat dari senarai std::?. 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