Rumah >pembangunan bahagian belakang >C++ >## Adakah Semua Iterators Tidak Sah Selepas `Padam` pada `std::vector`?

## Adakah Semua Iterators Tidak Sah Selepas `Padam` pada `std::vector`?

Barbara Streisand
Barbara Streisandasal
2024-10-25 10:43:30685semak imbas

## Are All Iterators Invalid After `erase` on a `std::vector`?

std::vector Iterator Invalidation: Membatalkan Semua Iterator Selepas Padam

Adalah biasa difahami bahawa memadamkan elemen daripada vektor hanya membatalkan iterator yang menunjuk kepada kedudukan selepas elemen yang dipadamkan. Walau bagaimanapun, isu utama timbul: adakah iterator pada kedudukan yang dipadamkan masih sah?

Menurut Piawaian C, jawapannya adalah tidak. Semua iterator pada atau selepas iterator diluluskan untuk memadam adalah tidak sah. Ini menunjukkan bahawa kod berikut, yang bertujuan untuk mengalih keluar integer ganjil daripada vektor, akan menghasilkan tingkah laku yang tidak ditentukan:

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

// Initialize the vector
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); // Invalidating iterator
    else ++it;
}</code>

Mengendalikan Lelaran Dengan Betul

Untuk mengendalikan lelaran dengan betul selepas memadam, gunakan iterator yang dikembalikan oleh padam. Peulang ini menunjuk kepada elemen sejurus selepas elemen yang dipadamkan (atau ke penghujung jika tiada).

Dalam kes ini, pendekatan yang lebih cekap untuk mengalih keluar integer ganjil ialah menggunakan pemadaman- keluarkan simpulan bahasa:

<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 Semua Iterators Tidak Sah Selepas `Padam` pada `std::vector`?. 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