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

Barbara Streisand
Lepaskan: 2024-10-25 10:43:30
asal
574 orang telah melayarinya

## 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

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!