Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ## **Adakah `std::vector::erase`-returned iterators Menuding ke Elemen Sah Selepas Pengalihan Keluar?**

## **Adakah `std::vector::erase`-returned iterators Menuding ke Elemen Sah Selepas Pengalihan Keluar?**

Barbara Streisand
Barbara Streisandasal
2024-10-25 13:11:30297semak imbas

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

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!

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