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