Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat C++: Iterator telah tamat tempoh, bagaimana untuk menyelesaikannya?

Ralat C++: Iterator telah tamat tempoh, bagaimana untuk menyelesaikannya?

WBOY
WBOYasal
2023-08-22 17:37:471487semak imbas

Ralat C++: Iterator telah tamat tempoh, bagaimana untuk menyelesaikannya?

Dalam pengaturcaraan C++, menggunakan iterator (Iterator) ialah cara biasa untuk merentasi unsur-unsur bekas. Walau bagaimanapun, apabila melintasi bekas, kadangkala anda menghadapi masalah bahawa lelaran telah tamat tempoh, menyebabkan program ranap atau menghasilkan keputusan yang tidak dijangka.

Jadi, apakah masalah yang iterator telah tamat tempoh? Ringkasnya, apabila kita menggunakan iterator untuk melintasi bekas, jika bekas itu diubah suai (seperti menambah atau memadam elemen, dsb.), ia boleh menyebabkan iterator menjadi tidak sah, iaitu elemen yang ditunjuk oleh iterator no lebih lama wujud atau kedudukan telah diubah, ralat akan berlaku jika iterator digunakan semula.

Bagaimana untuk menyelesaikan masalah yang iterator telah tamat tempoh? Berikut adalah beberapa penyelesaian biasa:

1 Gunakan fungsi padam dan bukannya fungsi buang

Dalam operasi menggunakan elemen kontena, fungsi buang dan padam sering digunakan. Kedua-duanya boleh digunakan untuk memadam elemen dalam bekas Walau bagaimanapun, fungsi alih keluar hanya menggerakkan elemen yang akan dipadamkan ke hujung bekas dan tidak benar-benar memadamkan elemen, manakala fungsi memadam sebenarnya memadamkan elemen daripada bekas. Oleh itu, jika kita ingin memadamkan elemen semasa melintasi bekas, sebaiknya gunakan fungsi padam supaya tidak menyebabkan iterator tamat tempoh.

2. Gunakan kata kunci auto

C++11 memperkenalkan kata kunci auto, yang boleh menyimpulkan jenis lelaran secara automatik. Apabila menggunakan kata kunci auto, pengkompil akan secara automatik memadankan jenis iterator untuk memastikan bahawa iterator sepadan dengan jenis bekas, dengan itu mengelakkan masalah ketidakpadanan jenis.

Contohnya:

vector<int> v = {1,2,3,4,5};
for(auto it = v.begin(); it != v.end(); ++it){
    // ...
}

Menggunakan kata kunci auto membolehkan pengkompil secara automatik menyimpulkan jenis lelaran untuk memastikan ia sepadan dengan jenis bekas.

3. Gunakan iterator yang betul semasa mengubah suai bekas

Apabila kita mengubah suai bekas, kita perlu memastikan menggunakan lelaran yang betul. Sebagai contoh, apabila melintasi bekas vektor, jika anda ingin memadam elemen, anda perlu menggunakan fungsi memadam, tetapi menggunakan fungsi memadam akan menyebabkan kedudukan semua elemen selepas elemen berubah. Jika kita masih menggunakan iterator sebelumnya untuk menunjuk ke elemen yang telah dialihkan, iterator akan menjadi tidak sah.

Untuk mengelak situasi ini, kita boleh merekodkan dahulu iterator kedudukan elemen yang akan dipadamkan sebelum melakukan operasi pemadaman, dan mengemas kini iterator dengan kedudukan selepas iterator ini untuk memastikan iterator masih menunjuk ke kedudukan yang betul. Kod sampel adalah seperti berikut:

vector<int> v = {1,2,3,4,5};
auto it = v.begin() + 2; // 记录要删除的元素位置
v.erase(it); // 删除元素
it = v.begin() + 2; // 更新迭代器

Ini memastikan bahawa iterator masih menunjuk ke lokasi yang betul dan mengelakkan masalah kegagalan iterator.

Ringkasnya, apabila menulis program C++, menggunakan iterator untuk melintasi bekas adalah operasi yang sangat biasa. Walau bagaimanapun, kegagalan iterator adalah masalah yang sangat biasa, jadi kita perlu memberi perhatian untuk mengelakkan masalah ini untuk memastikan ketepatan program.

Atas ialah kandungan terperinci Ralat C++: Iterator telah tamat tempoh, bagaimana untuk menyelesaikannya?. 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