Mengalih keluar Pendua daripada Vektor Tidak Diisih
Mengekalkan susunan kejadian pertama sambil menghapuskan pendua daripada vektor tidak diisih adalah penting dalam pelbagai situasi. Walaupun pendekatan mudah yang menggunakan set dan lelaran manual adalah berkesan, ia boleh dipertingkatkan dengan memanfaatkan algoritma STL.
Untuk mencapai matlamat ini, algoritma std::copy_if menyediakan penyelesaian yang mudah. Dengan mentakrifkan predikat yang menjejaki elemen yang telah diproses dan mengembalikan palsu untuk pendua, kami boleh menapis elemen yang diingini.
Jika sokongan C 11 tidak tersedia, nama kekok std::remove_copy_if boleh digunakan, dengan logiknya terbalik. Berikut ialah contoh yang belum diuji untuk menggambarkan:
template <typename T> struct NotDuplicate { bool operator()(const T& element) { return s_.insert(element).second; // true if s_.insert(element); } private: std::set<T> s_; };
Seterusnya, kod berikut boleh digunakan:
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
Dalam penyelesaian ini, std::ref memastikan bahawa functor stateful tidak disalin secara dalaman dalam algoritma. Walau bagaimanapun, std::copy_if tidak mengenakan sebarang keperluan ke atas kesan sampingan functor yang digunakan.
Atas ialah kandungan terperinci Bagaimana untuk Mengeluarkan Pendua daripada Vektor Tidak Diisih sambil Mengekalkan Pesanan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!