Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menyusun `std::map` dengan Cekap mengikut Nilai dalam C ?

Bagaimanakah Saya Boleh Menyusun `std::map` dengan Cekap mengikut Nilai dalam C ?

DDD
Lepaskan: 2024-12-02 09:29:10
asal
138 orang telah melayarinya

How Can I Efficiently Sort a `std::map` by Value in C  ?

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);
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan