Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memadamkan Elemen dengan Selamat daripada `std::vector` Semasa Mengulang?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 16:23:30429semak imbas

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>

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>

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>

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!

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