## Adakah Iterator pada Kedudukan Dipadam dalam std::vector::erase() Masih Sah?

Linda Hamilton
Lepaskan: 2024-10-28 12:21:31
asal
477 orang telah melayarinya

## Is the Iterator at the Erased Position in std::vector::erase() Still Valid?

Memahami Pembatalan Iterator dalam std::vector::erase()

Dalam perbincangan ini, kita mendalami topik ketidaksahihan iterator apabila memohon std::vector::erase(). Seperti yang diketahui daripada perbahasan sebelum ini, didapati bahawa pemadaman elemen daripada vektor membatalkan iterator yang terletak selepas elemen yang dipadamkan. Walau bagaimanapun, persoalan timbul: adakah lelaran yang diletakkan pada elemen yang dipadamkan masih dianggap sah?

Walaupun pemahaman intuitif kami bahawa lelaran pada kedudukan yang dipadam harus kekal boleh digunakan, tingkah laku yang tepat tidak selalu jelas. Untuk menggambarkan konsep ini, mari kita analisa coretan kod berikut yang mengalih keluar semua integer ganjil daripada vektor:

<code class="cpp">typedef std::vector<int> vectype;
vectype vec;

for (int i = 0; i < 100; ++i) vec.push_back(i);

vectype::iterator it = vec.begin();
while (it != vec.end()) {
    if (*it % 2 == 1) vec.erase(it);
    else ++it;
}</code>
Salin selepas log masuk

Walaupun kod ini berjaya dilaksanakan, ia melanggar amalan terbaik. Menurut standard C, erase() membatalkan semua iterator pada atau selepas iterator(s) yang disediakan sebagai parameter. Dalam kes ini, ini bermakna lelaran pada kedudukan yang dipadamkan menjadi tidak sah.

Walau bagaimanapun, padam() dengan mudah mengembalikan lelaran baharu yang menghala ke elemen serta-merta mengikuti elemen yang dipadamkan atau ke vec.end () jika tiada unsur sedemikian wujud. Lelaran baharu ini boleh digunakan untuk menyambung semula lelaran dengan selamat.

Adalah penting untuk ambil perhatian bahawa kaedah yang dinyatakan di atas untuk mengalih keluar unsur ganjil tidak cekap. Setiap kali elemen dipadamkan, elemen seterusnya mesti dianjakkan ke kiri dalam vektor, menghasilkan kerumitan O(n2). Tugas ini boleh dicapai dengan lebih cekap menggunakan simpulan bahasa padam-buang, yang beroperasi dalam O(n). Dengan mencipta predikat seperti is_odd(), kita boleh memperhalusi operasi pemadaman:

<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
Salin selepas log masuk

Atas ialah kandungan terperinci ## Adakah Iterator pada Kedudukan Dipadam dalam std::vector::erase() Masih Sah?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!