Mengisih std::vector mengikut Values of a Different std::vector
Masalah ini melibatkan penjajaran susunan vektor dengan susunan vektor lain. Sebagai contoh, Indeks vektor mengandungi nombor [3, 1, 2] dan Nilai vektor mengandungi rentetan "Ketiga, Pertama, Kedua." Isih Indeks dalam tertib menaik ([1, 2, 3]) seharusnya menyebabkan Nilai diisih dalam susunan yang sepadan (["Pertama", "Kedua", "Ketiga"]).
Penyelesaian :
Pendekatan biasa melibatkan mencipta susunan vektor dengan menggabungkan indeks daripada Indeks dan elemen sepadannya daripada Nilai. Vektor ini kemudiannya boleh diisih menggunakan pembanding tersuai yang membandingkan elemen dalam Indeks:
typedef vector<int>::const_iterator myiter; vector<pair<size_t, myiter>> order(Index.size()); size_t n = 0; for (myiter it = Index.begin(); it != Index.end(); ++it, ++n) order[n] = make_pair(n, it); struct ordering { bool operator ()(pair<size_t, myiter> const& a, pair<size_t, myiter> const& b) { return *(a.second) < *(b.second); } }; sort(order.begin(), order.end(), ordering());
Vektor pesanan yang terhasil kini mengandungi indeks yang diisih. Untuk menggunakan tertib ini pada Nilai, fungsi berikut boleh digunakan:
template <typename T> vector<T> sort_from_ref( vector<T> const& in, vector<pair<size_t, myiter>> const& reference ) { vector<T> ret(in.size()); size_t const size = in.size(); for (size_t i = 0; i < size; ++i) ret[i] = in[reference[i].first]; return ret; } Values = sort_from_ref(Values, order);
Fungsi ini membawa masuk vektor asal dan vektor rujukan yang mengandungi indeks yang diisih dan mengembalikan salinan dalam yang diisih sewajarnya.
Atas ialah kandungan terperinci Bagaimana untuk Menyusun Satu `std::vector` Berdasarkan Susunan Satu Lagi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!