Pengulang Pemadaman Vektor: Memahami Perangkap
Apabila bekerja dengan vektor, adalah penting untuk menggunakan lelaran pemadaman dengan betul untuk mengelakkan tingkah laku yang tidak dijangka. Dalam artikel ini, kami akan meneroka perangkap biasa yang berkaitan dengan pemadaman elemen dengan gelung.
Pertimbangkan kod berikut:
int main() { vector<int> res; res.push_back(1); vector<int>::iterator it = res.begin(); for ( ; it != res.end(); it++) { it = res.erase(it); //if (it == res.end()) // return 0; } }
Menurut dokumentasi, lelaran pemadam "menunjukkan kepada lokasi baharu elemen yang mengikuti elemen terakhir yang dipadamkan oleh panggilan fungsi." Ini menunjukkan bahawa pemadaman elemen terakhir dalam jujukan akan menyebabkan peulang menunjuk ke penghujung vektor.
Walau bagaimanapun, jika kita menjalankan kod ini tanpa menyemak sama ada ia == res.end(), atur cara ranap. Mengapa ini?
Perangkap Penambahan
Kunci untuk memahami tingkah laku ini terletak pada cara gelung for berfungsi. Selepas setiap lelaran gelung, lelaran ia dinaikkan secara automatik. Ini bermakna jika elemen terakhir dipadamkan, iterator akan menunjuk ke penghujung vektor, yang bukan lokasi yang sah untuk meningkat.
Dengan menambahkan if (it == res.end()) pulangan 0; semak, kami mengendalikan kes di mana elemen terakhir dipadamkan dan lelaran menghala ke penghujung. Ini menghalang operasi kenaikan daripada menyebabkan ranap.
Pendekatan Lebih Cekap
Sementara pendekatan di atas berfungsi, terdapat cara yang lebih cekap untuk memadamkan semua elemen daripada vektor . Daripada melelakan melalui vektor dan memadam setiap elemen secara individu, hanya memanggil res.clear() akan mengosongkan keseluruhan vektor tanpa memerlukan gelung.
Pemadaman Bersyarat
Walau bagaimanapun , jika anda hanya perlu memadamkan elemen tertentu berdasarkan syarat, anda boleh menggunakan corak berikut:
for ( ; it != res.end(); ) { if (condition) { it = res.erase(it); } else { ++it; } }
Ini pendekatan membolehkan anda melelakan melalui vektor, menyemak setiap elemen untuk keadaan dan padamkannya hanya jika syarat itu dipenuhi.
Atas ialah kandungan terperinci Mengapa Memadamkan Elemen Vektor dalam Gelung Menyebabkan Ranap, dan Bagaimana Saya Boleh Mengelakkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!