Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ## Adakah Iterators untuk Memadamkan Elemen dalam `std::vector` Masih Sah?

## Adakah Iterators untuk Memadamkan Elemen dalam `std::vector` Masih Sah?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 18:03:02329semak imbas

## Are Iterators to Erased Elements in a `std::vector` Still Valid?

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!

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