Rumah >pembangunan bahagian belakang >C++ >Bagaimana dengan Cekap Memadam Elemen daripada Vektor Semasa Lelaran Tanpa Membatalkan Iterator?

Bagaimana dengan Cekap Memadam Elemen daripada Vektor Semasa Lelaran Tanpa Membatalkan Iterator?

Susan Sarandon
Susan Sarandonasal
2024-11-04 07:37:021089semak imbas

How to Efficiently Erase Elements from a Vector During Iteration Without Invalidating the Iterator?

Pemadaman Cekap daripada Vektor Semasa Lelaran

Apabila melelaran melalui vektor, elemen yang memenuhi kriteria tertentu mungkin diperlukan. Walau bagaimanapun, penyingkiran terus boleh membatalkan lelaran yang digunakan untuk gelung. Artikel ini menyediakan penyelesaian untuk memadamkan elemen dengan cekap tanpa menggunakan kaedah v[i].

Mengekalkan Iterator Selepas Padam

Kaedah erase() mengembalikan lelaran baharu menunjuk ke elemen selepas elemen yang dikeluarkan. Ini membolehkan lelaran berterusan dengan mengemas kini keadaan gelung:

<code class="cpp">for(iterator it = begin; it != end(container); it = vec.erase(it))
{
    if (it->somecondition())
    {
        it = vec.erase(it);
    }
}</code>

Menggabungkan remove_if dan padam

Untuk mengoptimumkan proses penyingkiran, pertimbangkan untuk menggunakan std::remove_if dan padam bersama-sama:

<code class="cpp">iterator it = std::remove_if(begin, end, pred);
vec.erase(it, vec.end());</code>

Pendekatan ini memisahkan penyingkiran elemen yang layak daripada penyingkiran sebenar mereka, menghasilkan operasi O(N) yang lebih pantas.

Contoh dengan Pembuangan Berasaskan Templat

Untuk menyamaratakan proses penyingkiran, gunakan predikat berasaskan templat dan kelas remove_by_caller:

<code class="cpp">class remove_by_caller
{
public:
    remove_by_caller(AguiWidgetBase* pWidget) : mWidget(pWidget) {}

    template <typename T>
    bool operator()(const T& pX) const
    {
        return pX.getCaller() == mWidget;
    }

private:
    AguiWidgetBase* mWidget;
};

std::vector<AguiTimedEvent>::iterator it =
    std::remove_if(timedEvents.begin(), timedEvents.end(), remove_by_caller(widget));
timedEvents.erase(it, timedEvents.end());</code>

Melalui pendekatan ini, adalah mungkin untuk memadamkan elemen secara cekap daripada vektor sambil mengekalkan lelaran.

Atas ialah kandungan terperinci Bagaimana dengan Cekap Memadam Elemen daripada Vektor Semasa Lelaran Tanpa Membatalkan Iterator?. 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