Rumah > pembangunan bahagian belakang > C++ > Mengapa Memadamkan Elemen Vektor dengan Ranap Iterator Tanpa Pemeriksaan Bersyarat Khusus?

Mengapa Memadamkan Elemen Vektor dengan Ranap Iterator Tanpa Pemeriksaan Bersyarat Khusus?

Mary-Kate Olsen
Lepaskan: 2024-12-07 12:25:13
asal
986 orang telah melayarinya

Why Does Erasing Vector Elements with an Iterator Crash Without a Specific Conditional Check?

Mengapa Kod "Vector Erase Iterator" Ranap Tanpa Pemeriksaan Bersyarat Tambahan?

Pertimbangkan kod berikut:

vector<int> res;
res.push_back(1);
vector<int>::iterator it = res.begin();
for( ; it != res.end(); it++)
{
    it = res.erase(it);
}
Salin selepas log masuk

Kod ini cuba memadamkan semua elemen daripada vektor menggunakan iterator. Walau bagaimanapun, ia ranap tanpa semakan bersyarat tambahan berikut:

if(it == res.end())
    return 0;
Salin selepas log masuk

Penjelasan

Fungsi padam mengembalikan iterator yang menunjuk ke elemen seterusnya selepas elemen yang dipadamkan. Apabila elemen terakhir dipadamkan, lelaran yang dikembalikan adalah sama dengan res.end().

Dalam kod asal, tanpa semakan bersyarat, gelung for terus menambah lelaran walaupun selepas mencapai penghujung vektor. Ini mengakibatkan percubaan untuk mengakses memori di luar sempadan vektor, yang membawa kepada ranap sistem.

Dengan menggunakan semakan bersyarat, gelung ditamatkan apabila lelaran mencapai penghujung vektor (ia == res. akhir()). Ini menghalang ranap sistem.

Struktur Gelung Alternatif

Untuk mengelakkan keperluan untuk semakan bersyarat, anda boleh menulis semula gelung seperti berikut:

while (it != res.end())
{
    it = res.erase(it);
}
Salin selepas log masuk

Gelung ini akan ditamatkan secara automatik apabila ia mencapai res.end(), kerana syaratnya tidak akan berlaku lagi benar.

Pertimbangan Tambahan

Apabila memadamkan elemen secara bersyarat, adalah perlu untuk menambah lelaran secara manual jika elemen tidak dipadamkan. Ini boleh dicapai menggunakan:

for ( ; it != res.end(); )
{
   if (condition) 
        it = res.erase(it);
   else 
        ++it;
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Memadamkan Elemen Vektor dengan Ranap Iterator Tanpa Pemeriksaan Bersyarat Khusus?. 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