Rumah >pembangunan bahagian belakang >C++ >Mengapa Memadamkan Elemen daripada Vektor dengan Iterator dan Menaikkannya dalam For Loop Menyebabkan Ranap?

Mengapa Memadamkan Elemen daripada Vektor dengan Iterator dan Menaikkannya dalam For Loop Menyebabkan Ranap?

DDD
DDDasal
2024-12-06 20:43:13489semak imbas

Why Does Erasing Elements from a Vector with an Iterator and Incrementing it in a For Loop Cause a Crash?

Peulang pemadam vektor dan kelakuannya yang tidak dijangka

Dalam coretan kod yang disediakan, gelung for menggunakan res.erase(it) untuk memadamkan elemen daripada vektor res, kemudian menambahnya dalam gelung yang sama. Walau bagaimanapun, ini membawa kepada kelakuan yang tidak dijangka dan ranap sistem.

Kod ini menggunakan lelaran vektor, yang menunjukkan kepada elemen semasa sedang diproses. Fungsi res.erase(it) memadamkan elemen yang ditunjuk olehnya dan mengembalikan iterator yang menunjuk ke elemen seterusnya dalam vektor. Dalam kod yang disediakan, gelung terus menggunakan lelaran yang dikembalikan ini, walaupun ia menunjuk ke penghujung vektor (.end()).

Iterators akses rawak, seperti yang digunakan di sini, tidak boleh bertambah melepasi penghujung jujukan yang dimilikinya. Oleh itu, penambahan .end() dalam gelung membawa kepada ranap sistem.

Untuk menyelesaikan isu ini, gelung for harus diubah suai untuk menggunakan gelung sementara dan bukannya bergantung pada kenaikan automatik yang disediakan oleh gelung for:

while (it != res.end()) {
  it = res.erase(it);
}

Pendekatan ini memastikan bahawa gelung berterusan sehingga ia mencapai penghujung vektor, dan ia melangkau elemen yang dipadam dengan betul tanpa risiko ranap disebabkan kepada operasi kenaikan iterator tidak sah.

Atas ialah kandungan terperinci Mengapa Memadamkan Elemen daripada Vektor dengan Iterator dan Menaikkannya dalam For Loop Menyebabkan Ranap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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