Bagaimana untuk Memadamkan Elemen dengan Selamat daripada `std::vector` Semasa Mengulang?

Mary-Kate Olsen
Lepaskan: 2024-11-02 16:23:30
asal
367 orang telah melayarinya

How to Safely Erase Elements from an `std::vector` While Iterating?

Memadamkan daripada std::vector While Iterating

Apabila melelaran pada std::vector dan cuba memadamkan elemen berdasarkan keadaan, menggunakan kaedah v[i] boleh membawa kepada tingkah laku yang tidak dapat diramalkan kerana ketidaksahihan iterator. Untuk menangani isu ini dengan berkesan, adalah disyorkan untuk menggunakan teknik lelaran yang betul menggunakan iterator.

Satu pendekatan ialah menggunakan kaedah erase(), yang mengembalikan lelaran baharu. Ini membenarkan penerusan lelaran tanpa kehilangan jejak elemen yang diingini:

<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

Perhatikan bahawa dalam pendekatan ini, kita mesti mendapatkan penghujung secara eksplisit setiap kali kerana lelaran akhir sebelumnya mungkin menjadi tidak sah disebabkan pemadaman .

Kaedah alternatif ialah menggabungkan std::remove_if dengan erase():

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

Pendekatan ini menggantikan kerumitan masa O(N2) untuk memadamkan elemen secara individu dengan operasi O(N) yang lebih cekap. Operasi erase() mengalih keluar elemen yang telah ditandakan oleh operasi remove_if.

Dalam kes khusus anda, anda boleh mencipta predikat tersuai yang menyemak keadaan pengalihan keluar:

<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

Dengan menggunakan teknik ini, anda boleh memadamkan elemen dengan cekap daripada std::vector sambil mengulanginya, tanpa menjejaskan integriti lelaran proses.

Atas ialah kandungan terperinci Bagaimana untuk Memadamkan Elemen dengan Selamat daripada `std::vector` Semasa Mengulang?. 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!