Rumah > pembangunan bahagian belakang > C++ > Adakah Memadam Elemen daripada `std::set` Semasa Mengulang Selamat dan Cara Melakukannya dengan Betul?

Adakah Memadam Elemen daripada `std::set` Semasa Mengulang Selamat dan Cara Melakukannya dengan Betul?

DDD
Lepaskan: 2024-12-11 09:47:18
asal
494 orang telah melayarinya

Is Erasing Elements from a `std::set` While Iterating Safe and How to Do It Correctly?

Memadamkan Elemen daripada std::set Semasa Mengulang: Adakah Ia Selamat?

Meletup melalui set dan mengalih keluar elemen yang memenuhi kriteria tertentu ialah tugas biasa dalam pengaturcaraan C. Walau bagaimanapun, gelagat memadamkan elemen semasa lelaran mungkin menimbulkan kebimbangan mengenai penyalahgunaan lelaran.

Dalam coretan kod yang disediakan, anda melelakan melalui set integer dan memadamkan nombor genap. Walaupun kod ini nampaknya berfungsi, ia bergantung pada tingkah laku khusus pelaksanaan. Piawaian C tidak menyatakan secara eksplisit perkara yang berlaku apabila elemen dipadamkan daripada set semasa anda mengulanginya.

Pendekatan Pematuhan Standard

Untuk memastikan mudah alih dan kebolehpercayaan, pertimbangkan untuk menggunakan pendekatan pematuhan standard:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        numbers.erase(it++);
    }
    else {
        ++it;
    }
}
Salin selepas log masuk

Pendekatan ini menggunakan kenaikan postfix operator it , yang melepasi iterator lama untuk memadam tetapi memajukannya untuk menunjuk ke elemen seterusnya sebelum kembali. Akibatnya, gelung berulang dengan betul dan lelaran kekal sah selepas setiap operasi pemadaman.

Penyelesaian C 11

C 11 memperkenalkan kaedah pemadaman yang dikemas kini untuk set itu memudahkan proses pemadaman elemen semasa mengulang:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        it = numbers.erase(it);
    }
    else {
        ++it;
    }
}
Salin selepas log masuk

Pendekatan ini menggunakan kaedah padam, yang mengembalikan iterator kepada elemen yang mengikuti elemen yang dipadamkan (atau set::end jika elemen terakhir dipadamkan). Ini memudahkan gelung dengan menghapuskan keperluan untuk menggunakan kenaikan postfix dan memastikan bahawa ia kekal sah selepas setiap operasi pemadaman.

Kesimpulan

Sementara coretan kod awal mungkin berfungsi dalam sesetengah pelaksanaan, bergantung pada tingkah laku khusus pelaksanaan biasanya tidak disyorkan. Dengan menggunakan pendekatan pematuhan standard atau kaedah pemadaman C 11, anda boleh memastikan kod anda berfungsi dengan betul dan mudah alih merentas penyusun dan platform yang berbeza.

Atas ialah kandungan terperinci Adakah Memadam Elemen daripada `std::set` Semasa Mengulang Selamat dan Cara Melakukannya dengan Betul?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan