Rumah >pembangunan bahagian belakang >C++ >## Adakah Iterators untuk Memadamkan Elemen dalam `std::vector` Masih Sah?
std::vector Iterator Invalidation: Mencungkil Kesahihan Iterator Selepas Pemadaman
Dalam alam C , selok-belok lelaran vektor dan tingkah laku mereka selepas pemadaman boleh menjadi punca kekeliruan. Untuk menyelidiki isu ini, kami akan meneroka senario tertentu:
Mengesahkan Kegigihan Iterator Selepas Operasi Padam
Persoalan penting timbul mengenai kesahihan iterator yang menunjuk terus kepada elemen yang dipadamkan dalam std::vector. Tanggapan yang lazim ialah iterator yang menunjuk kepada kedudukan selepas elemen yang dipadamkan adalah tidak sah. Walau bagaimanapun, persoalannya masih ada: adakah iterator yang menunjuk ke lokasi sebenar elemen yang dipadamkan masih sah?
Analisis dan Contoh
Untuk menjelaskan isu ini, pertimbangkan coretan kod berikut, yang cuba untuk menghapuskan semua integer ganjil daripada vektor:
<code class="cpp">vector<int> vec; for (int i = 0; i < 100; ++i) vec.push_back(i); vector<int>::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); else ++it; }</code>
Walaupun kod ini mungkin kelihatan berfungsi dengan betul, adalah penting untuk menyelidiki lebih mendalam untuk menentukan kesahihannya.
Menjawab Soalan
Jawapannya dengan jelas menunjukkan ketidaksahihan bukan sahaja iterator yang menunjuk ke kedudukan selepas elemen yang dipadam tetapi juga iterator yang menunjuk ke lokasi sebenar elemen itu.
Walau bagaimanapun, pemadaman elemen memberikan lelaran yang dipulangkan menunjuk sejurus selepas elemen yang dialih keluar atau ke penghujung jika tiada yang tinggal. Ini membolehkan kesinambungan lelaran yang lancar.
Penghapusan Elemen Ganjil yang Cekap
Perlu diingat bahawa coretan kod yang dibentangkan bukanlah kaedah yang paling berkesan untuk mengalih keluar unsur ganjil. Pendekatan yang jauh lebih cekap melibatkan simpulan bahasa padam-buang, yang menggunakan predikat tersuai untuk mencari dan mengenal pasti elemen untuk dialih keluar. Sebagai contoh, kita boleh mentakrifkan predikat yang dipanggil is_odd dan menggunakannya dengan remove_if dan padam:
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
Ini menghapuskan pergerakan elemen yang mahal, mengurangkan kerumitan masa kepada O(n).
Atas ialah kandungan terperinci ## Adakah Iterators untuk Memadamkan Elemen dalam `std::vector` Masih Sah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!