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
Lepaskan: 2024-11-04 07:37:02
asal
1101 orang telah melayarinya

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:

1

2

3

4

5

6

7

<code class="cpp">for(iterator it = begin; it != end(container); it = vec.erase(it))

{

    if (it->somecondition())

    {

        it = vec.erase(it);

    }

}</code>

Salin selepas log masuk

Menggabungkan remove_if dan padam

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

1

2

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

vec.erase(it, vec.end());</code>

Salin selepas log masuk

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<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>

Salin selepas log masuk

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!

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