Rumah >pembangunan bahagian belakang >C++ >## Adakah Semua Iterators Tidak Sah Selepas `Padam` pada `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!