Bagaimana untuk Memadamkan Elemen Dengan Selamat Dari std::vector Semasa Lelaran?

Barbara Streisand
Lepaskan: 2024-11-01 12:24:02
asal
897 orang telah melayarinya

How to Safely Erase Elements From a std::vector During Iteration?

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!