Memadamkan Elemen daripada std::vector Semasa Lelaran: Strategi dan Prestasi
Apabila melelaran melalui std::vector sambil perlu memadam elemen berdasarkan keadaan, pendekatan tradisional menggunakan gelung for dengan iterator boleh menghadapi masalah. Memadamkan elemen akan membatalkan lelaran, menjadikan gelung tidak lengkap. Untuk menangani cabaran ini, mari kita terokai strategi optimum untuk mengendalikan senario sedemikian.
Lelaran dengan Penjejakan Pembatalan
Salah satu pendekatan ialah dengan menjejaki ketidaksahihan iterator secara eksplisit yang disebabkan oleh pemadaman elemen. Dalam kod sampel yang disediakan:
<code class="cpp">for (iterator it = begin; it != end(container) /* !!! */; ) { if (it->somecondition()) { it = vec.erase(it); // Returns the new iterator to continue from. } else { ++it; } }</code>
Perbezaan utama di sini ialah penggunaan hujung(bekas) dan bukannya hujung yang diprakira, yang mengemas kini rujukan lelaran selepas setiap operasi pemadaman. Ini memastikan perbandingan lelaran yang sah semasa gelung.
Menggabungkan std::remove_if dan padam
Pendekatan yang lebih cekap melibatkan menggabungkan fungsi std::remove_if dan padam. Ini mengoptimumkan proses dengan mengalih keluar keperluan untuk penjejakan ketidaksahihan:
<code class="cpp">iterator it = std::remove_if(begin, end, pred); vec.erase(it, vec.end());</code>
Di sini, pred mewakili predikat penyingkiran yang menentukan elemen yang hendak dialih keluar. Pendekatan ini menghapuskan kerumitan O(N^2) yang dikaitkan dengan pemadaman berulang dan meningkatkan prestasi kepada O(N).
Aplikasi Contoh
Dalam sampel kod yang disediakan, struct RemoveTimedEvent berfungsi sebagai predikat penyingkiran untuk mengenal pasti dan mengalih keluar peristiwa yang dikaitkan dengan widget tertentu dalam vektor peristiwa bermasa.
Dengan memanfaatkan salah satu strategi ini, anda boleh memadam elemen secara berkesan daripada std::vector semasa lelaran sambil mengekalkan fungsi dan prestasi lelaran yang betul.
Atas ialah kandungan terperinci Bagaimana untuk Memadamkan Elemen Dengan Selamat Dari std::vector Semasa Lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!