Rumah > pembangunan bahagian belakang > C++ > Mengapa Memadamkan Elemen Vektor dalam Gelung Menyebabkan Ranap, dan Bagaimana Saya Boleh Mengelakkannya?

Mengapa Memadamkan Elemen Vektor dalam Gelung Menyebabkan Ranap, dan Bagaimana Saya Boleh Mengelakkannya?

Mary-Kate Olsen
Lepaskan: 2024-12-09 19:55:11
asal
832 orang telah melayarinya

Why Does Erasing Vector Elements in a Loop Cause a Crash, and How Can I Avoid It?

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;
    }
}
Salin selepas log masuk

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;
  }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan