Dalam bidang pengaturcaraan C, operasi "vector erase iterator" ialah alat penting untuk memanipulasi koleksi data. Walau bagaimanapun, pelaksanaannya kadangkala boleh membawa kepada tingkah laku yang membingungkan.
Pertimbangkan kod berikut, yang cuba mengalih keluar setiap elemen daripada vektor:
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 C, "Akses rawak iterator menunjuk ke lokasi baharu elemen yang mengikuti elemen terakhir yang dipadamkan oleh panggilan fungsi, iaitu penghujung vektor jika operasi memadamkan elemen terakhir dalam jujukan."
Kod di atas, bagaimanapun, ranap apabila dilaksanakan. Untuk menyelesaikan isu ini, syarat tambahan diperkenalkan:
if(it == res.end()) return 0;
Dengan pengubahsuaian ini, kod berjaya mengalih keluar semua elemen daripada vektor.
Tetapi mengapa ini perlu?
Teka-teki terletak pada gelagat rumit untuk menambah iterator dalam C . Selepas setiap operasi pemadaman, ia menunjuk kepada lelaran yang sah seterusnya. Apabila elemen terakhir dipadamkan, ia menunjukkan kepada lelaran akhir, yang tidak dibenarkan untuk ditambah.
Dengan menambahkan semakan bersyarat, gelung keluar apabila ia mencapai lelaran akhir, menghalang atur cara cuba untuk kenaikan melebihi julat yang sah.
Walau bagaimanapun, pendekatan ini masih mempunyai had. Ia melangkau elemen selepas setiap operasi pemadaman, dengan berkesan menduplikasi nilai lelaran. Penyelesaian yang lebih cekap ialah menggunakan struktur gelung ini:
while (it != res.end()) { it = res.erase(it); }
Kod ini memastikan setiap elemen dipadamkan dan seterusnya memajukan lelaran dengan betul.
Akhir sekali, untuk situasi di mana pemadaman unsur bersyarat adalah diperlukan, pertimbangkan untuk menggunakan skema gelung berikut:
for ( ; it != res.end(); ) { if (condition) { it = res.erase(it); } else { ++it; } }
Dengan memahami nuansa gelagat lelaran dalam C , pembangun dengan yakin boleh memanipulasi vektor dan mencapai kefungsian yang diingini.
Atas ialah kandungan terperinci Mengapa Memadamkan Elemen daripada Vektor C Menggunakan Iterator Memerlukan Pengendalian Khas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!