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
Mary-Kate Olsenasal
2024-12-07 12:25:13997semak imbas

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);
}

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!

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