Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Menggunakan Idiom Erase-Remove_if untuk Mengeluarkan Elemen Daripada Vektor Tidak Berfungsi Seperti Yang Dijangkakan?

Mengapa Menggunakan Idiom Erase-Remove_if untuk Mengeluarkan Elemen Daripada Vektor Tidak Berfungsi Seperti Yang Dijangkakan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-16 15:01:02756semak imbas

Why Does Using the Erase-Remove_if Idiom to Remove Elements From a Vector Not Work As Expected?

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:

  • std::remove_if mengimbas vektor, menggerakkan elemen yang sepadan dengan predikat (elemen dengan .first == 4) hingga akhir.
  • std::remove_if kembali iterator yang menunjuk kepada elemen pertama yang tidak sepadan dengan predikat (iaitu, elemen pertama yang perlu disimpan).
  • std::erase mengalih keluar julat elemen daripada lelaran yang dikembalikan ke penghujung vektor, dengan berkesan memadamkan semua elemen dengan .first == 4.

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!

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