Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggunakan Idiom Erase-Remove_if untuk Mengeluarkan Elemen Daripada Vektor Tidak Berfungsi Seperti Yang Dijangkakan?
Memahami Idiom erase-remove_if untuk Pemadaman Vektor
Dalam C , simpulan bahasa erase-remove_if digunakan secara meluas untuk mengalih keluar elemen dengan cekap daripada sesuatu vektor berdasarkan kriteria tertentu. Mari kita mendalami contoh khusus di mana simpulan bahasa ini telah dilaksanakan secara tidak betul dan terokai kemungkinan perangkap.
Masalahnya:
Pertimbangkan vektor yang dipanggil stopPoints yang mengandungi pasangan integer dan arah nilai. Matlamatnya adalah untuk memadam semua pasangan yang mengandungi integer tertentu (cth., 4) daripada vektor menggunakan simpulan bahasa erase-remove_if. Walau bagaimanapun, selepas melaksanakan kod, hasilnya adalah tidak dijangka.
stopPoints.erase(std::remove_if(stopPoints.begin(), stopPoints.end(), [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));
Selepas operasi ini, vektor masih mengandungi tika pasangan dengan nilai .first ditetapkan kepada 4.
Penyelesaian:
Ralat terletak pada penggunaan fungsi pemadaman yang salah. Dalam simpulan bahasa erase-remove_if, fungsi std::erase memerlukan dua iterator—peulang kepada elemen pertama untuk dialih keluar dan iterator ke hujung bekas.
stopPoints.erase(std::remove_if(stopPoints.begin(), stopPoints.end(), [](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }), stopPoints.end());
Dalam pelaksanaan yang diperbetulkan ini, julat dari iterator yang dikembalikan oleh std::remove_if (menunjuk ke elemen pertama untuk dialih keluar) ke penghujung vektor dipadamkan, dengan berkesan mengalih keluar semua elemen yang padankan predikat (.first == 4 dalam kes ini).
Penjelasan:
Kesimpulan:
Idiom erase-remove_if ialah alat yang berkuasa untuk mengalih keluar elemen dengan cekap daripada vektor yang memenuhi kriteria tertentu. Memahami bagaimana fungsi std::remove_if dan std::erase berinteraksi adalah penting untuk pelaksanaannya yang betul.
Atas ialah kandungan terperinci Mengapa Menggunakan Idiom Erase-Remove_if untuk Mengeluarkan Elemen Daripada Vektor Tidak Berfungsi Seperti Yang Dijangkakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!