Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyusun std::map dengan cekap mengikut Nilai?

Bagaimana untuk Menyusun std::map dengan cekap mengikut Nilai?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-26 10:33:14293semak imbas

How to Efficiently Sort a std::map by Value?

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> &amp;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> &amp;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...> &amp;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!

Kenyataan:
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