Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memadamkan Elemen dengan Selamat daripada `std::set` Semasa Mengulang?

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

Linda Hamilton
Linda Hamiltonasal
2024-12-28 13:21:10979semak imbas

How to Safely Delete Elements from a `std::set` While Iterating?

Memadamkan Elemen daripada std::set Semasa Mengulang

Apabila melelaran melalui set, adalah perlu untuk mengalih keluar elemen tertentu berdasarkan kriteria tertentu. Walaupun nampaknya logik untuk mengandaikan bahawa pemadaman elemen akan membatalkan lelaran, tingkah laku ini bergantung pada pelaksanaan.

Standard 23.1.2.8 menyatakan bahawa "Ahli sisip tidak akan menjejaskan kesahihan iterator dan rujukan kepada bekas, dan ahli pemadaman hendaklah membatalkan hanya pengulang dan rujukan kepada elemen yang dipadamkan." Berdasarkan ini, tidak boleh diandaikan bahawa pemadaman elemen semasa lelaran akan sentiasa membatalkan lelaran.

Satu pendekatan ialah menggunakan pengendali kenaikan postfix selepas memadamkan elemen. Ini menghantar kedudukan lama kepada fungsi memadam sambil serentak menghalakan lelaran ke kedudukan yang lebih baharu:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        numbers.erase(it++);
    }
    else {
        ++it;
    }
}

Kaedah lain melibatkan menyalin lelaran semasa dan menambahnya kemudian:

while (it != numbers.end()) {
    // Copy the current iterator and increment it
    std::set<int>::iterator current = it++;
    int n = *current;
    if (n % 2 == 0) {
        // Don't invalidate iterator it, as it points to the next element
        numbers.erase(current);
    }
}

C 11 memudahkan proses ini dengan fungsi pemadaman mengembalikan lelaran kepada elemen selepas yang terakhir dialih keluar elemen:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        it = numbers.erase(it);
    }
    else {
        ++it;
    }
}

Atas ialah kandungan terperinci Bagaimana untuk Memadamkan Elemen dengan Selamat daripada `std::set` 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