Rumah >pembangunan bahagian belakang >C++ >Mengapa Memadamkan Elemen Vektor dengan Ranap Iterator Tanpa Pemeriksaan Bersyarat Khusus?
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); }
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;
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); }
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; }
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!