Isih std::peta mengikut Nilai
Mengisih std::peta mengikut nilai, bukannya dengan kunci, adalah keperluan biasa dalam pelbagai senario pengaturcaraan. Artikel ini menyediakan penyelesaian yang elegan untuk masalah ini dengan membalikkan pasangan kunci dan nilai dalam peta menggunakan fungsi templat tersuai.
Fungsi Templat Tersuai untuk Membalikkan Pasangan dan Peta
Penyelesaian yang disediakan melibatkan dua fungsi templat tersuai: flip_pair() dan flip_map(). Fungsi flip_pair() mengambil sepasang nilai dan membalikkannya, menghasilkan pasangan baharu dengan nilai bertukar.
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); }
Fungsi flip_map() menggunakan fungsi flip_pair() untuk menyelak semua kekunci- pasangan nilai dalam peta sumber dan kembalikan multimap baharu dengan terbalik berpasangan.
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; }
Contoh Penggunaan
Untuk mengisih std::map mengikut nilai, seseorang boleh menggunakan fungsi flip_map() untuk mencipta multimap baharu dengan pasangan terbalik. Multimap ini akan diisih mengikut nilai bekas peta sumber.
std::map<int, double> src; ... std::multimap<double, int> dst = flip_map(src); // dst is now sorted by what used to be the value in src!
Sumber Bersekutu Generik untuk C 11 dan Kemudian
Untuk bekas bersekutu alternatif untuk std: :map, seperti std::unordered_map, fungsi yang lebih generik boleh digunakan untuk mengendalikan kedua-dua std::map dan std::unordered_map sources.
// flips an associative container of A,B pairs to B,A pairs 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; }
Fungsi ini boleh digunakan dengan mana-mana bekas bersekutu yang menyokong parameter templat yang diperlukan, seperti std::map, std::unordered_map dan banyak lagi.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyusun `std::map` dengan Cekap mengikut Nilai dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!