Cara Isih std::peta mengikut Nilai
Mengisih std::peta mengikut nilai dan bukannya kunci boleh mencabar. Satu penyelesaian biasa ialah mencipta multimap sementara yang membalikkan pasangan nilai kunci dan mengisihnya. Walau bagaimanapun, terdapat teknik alternatif yang boleh memberikan pendekatan yang lebih bersih dan serba boleh.
Membalikkan Pasangan
Coretan kod berikut menunjukkan cara membalikkan pasangan nilai kunci dalam std::map untuk mencipta multimap baharu yang diisih mengikut nilai:
template<typename A, typename B> std::pair<B,A> flip_pair(const std::pair<A,B> &p) { return std::pair<B,A>(p.second, p.first); } template<typename A, typename B> std::multimap<B,A> flip_map(const std::map<A,B> &src) { std::multimap<B,A> dst; std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<A,B>); return dst; }
Dengan memanggil flip_map pada std::map asal, anda boleh mendapatkan multimap yang diisih mengikut nilai.
Sumber Bersekutu Generik
Pendekatan ini boleh digeneralisasikan untuk membalikkan bekas bersekutu mana-mana taip menggunakan templat variadic:
template<typename A, typename B, template<class,class,class...> class M, class... Args> std::multimap<B,A> flip_map(const M<A,B,Args...> &src) { std::multimap<B,A> dst; std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<A,B>); return dst; }
Lebihan generik ini berfungsi dengan mana-mana bekas bersekutu yang menyokong algoritma std::transform, termasuk std::map dan std::unordered_map.
Atas ialah kandungan terperinci Bagaimana untuk Menyusun std::map dengan cekap mengikut Nilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!