Rumah >pembangunan bahagian belakang >C++ >## **Adakah `std::vector::erase`-returned iterators Menuding ke Elemen Sah Selepas Pengalihan Keluar?**
Pembatalan std::vector Iterator: Penjelasan Terperinci
Konsep ketidaksahihan iterator dalam std::vector telah kerap dibincangkan. Untuk menjelaskannya, pemadaman elemen vektor melalui std::vector::erase membatalkan pelelang yang diletakkan secara ketat selepas elemen yang dipadamkan.
Walau bagaimanapun, kesahihan lelaran pada kedudukan tepat elemen yang dipadamkan masih tidak pasti. Secara logiknya, seseorang mungkin menganggap lelaran ini kekal sah kerana pelaksanaan asas vektor biasanya mengalihkan elemen yang tinggal untuk mengisi ruang kosong. Walau bagaimanapun, tingkah laku dan potensi yang tepat untuk hasil yang tidak ditentukan adalah kurang pasti.
Pertimbangkan contoh berikut, yang menggambarkan penyingkiran 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>
Walaupun kod ini kelihatan seperti laksanakan tanpa ralat dalam amalan, kesahihannya masih boleh dipertikaikan.
Jawapannya terletak pada kelakuan pemadaman: ia sememangnya membatalkan semua iterator pada atau selepas iterator diluluskan untuk memadam. Walau bagaimanapun, ia juga mengembalikan lelaran baharu指向的元素sejurus selepas elemen yang dipadamkan atau hingga ke penghujungnya jika elemen tersebut tidak wujud. Lelaran ini boleh digunakan untuk menyambung semula lelaran.
Adalah penting untuk ambil perhatian bahawa kaedah penyingkiran integer ganjil di atas adalah tidak cekap (O(n2)) kerana setiap pemadaman memerlukan anjakan semua unsur-unsur seterusnya. Idiom padam-buang menawarkan penyelesaian yang jauh lebih cekap (O(n)):
<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>
Atas ialah kandungan terperinci ## **Adakah `std::vector::erase`-returned iterators Menuding ke Elemen Sah Selepas Pengalihan Keluar?**. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!