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!