Rumah >pembangunan bahagian belakang >C++ >Mengapa Adakah Kod Padam-Buang_Jika Kod Meninggalkan Pendua?

Mengapa Adakah Kod Padam-Buang_Jika Kod Meninggalkan Pendua?

Barbara Streisand
Barbara Streisandasal
2024-11-10 14:33:021005semak imbas

Why Is My Erase-Remove_If Code Leaving Duplicates?

Erase-Remove_If Idiom: Betul Aplikasi

Erase-remove_if idiom ialah teknik serba boleh untuk mengeluarkan unsur-unsur dari bekas dengan cekap berdasarkan predikat. Walau bagaimanapun, pelaksanaan yang tidak betul boleh membawa kepada hasil yang tidak dijangka.

Dalam contoh yang diberikan, anda bertujuan untuk mengalih keluar pasangan dengan nilai .pertama 4 daripada vektor pasangan menggunakan erase-remove_if. Walau bagaimanapun, kod anda meninggalkan anda dengan pendua, menunjukkan ralat.

Kod yang betul hendaklah:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());

Penjelasan terletak pada mekanisme erase-remove_if.

Cara Ia Berfungsi

std::remove_if menukar elemen dalam vektor kepada elemen kumpulan yang tidak sepadan dengan predikat ke arah permulaan. Ia kemudian mengembalikan lelaran kepada elemen pertama yang akan dialih keluar, menandakan pemisahan antara elemen untuk disimpan dan dialih keluar.

std::vector::erase bermula pada lelaran yang dikembalikan dan memadamkan semua elemen berikutnya, dengan berkesan mengalih keluar semua elemen yang sepadan dengan predikat.

Dalam kod awal anda, anda meninggalkan parameter kedua untuk std::erase, yang membawa kepada hanya elemen yang ditunjukkan oleh lelaran yang dikembalikan akan dialih keluar. Ini mengakibatkan pendua kerana elemen berikutnya yang sepadan dengan predikat tidak dipadamkan.

Dengan memasukkan parameter kedua, stopPoints.end(), kami mengarahkan padam untuk mengalih keluar julat bermula dari lelaran yang dikembalikan ke penghujung vektor, memastikan semua elemen padanan dialih keluar.

Untuk mendapatkan maklumat yang lebih komprehensif tentang simpulan bahasa padam-buang, rujuk entri Wikipedia: https://en.wikipedia.org/wiki/Erase–remove_idiom

Atas ialah kandungan terperinci Mengapa Adakah Kod Padam-Buang_Jika Kod Meninggalkan Pendua?. 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