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:
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; } }
Kod yang diubah suai ini berulang melalui senarai dan:
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!