Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya Boleh Isih std::map mengikut Nilai Daripada Kunci?

Bagaimanakah saya Boleh Isih std::map mengikut Nilai Daripada Kunci?

DDD
DDDasal
2024-12-25 05:22:13347semak imbas

How Can I Sort an std::map by Value Instead of Key?

Mengisih std::peta mengikut Nilai

Mengisih std::peta mengikut nilai dan bukannya kunci boleh menjadi lebih kompleks daripada mengisih mengikut kunci. Berikut ialah analisis mendalam tentang isu dan penyelesaian:

Penyelesaian 1: Menggunakan Multimap

Untuk mengisih std::map mengikut nilai, kita boleh mencipta multimap dengan nilai sebagai kunci dan kunci sebagai nilai. Ini membolehkan kami mengisih mengikut nilai, seperti dalam contoh berikut:

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 mengulangi peta asal dan memasukkan pasangan terbalik ke dalam multimap, kita pada asasnya menyongsangkan hubungan nilai kunci dan kemudian boleh susun mengikut kekunci baharu (nilai asal).

Penyelesaian 2: Sumber Bersekutu Generik (C 11 Diperlukan)

Untuk bekas bersekutu alternatif (cth., std::unordered_map), kita boleh menggunakan penyelesaian generik berikut:

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 ini berfungsi untuk kedua-dua std::map dan std::unordered_map dengan menggunakan templat variadic untuk mengendalikan jenis bekas bersekutu yang berbeza.

Atas ialah kandungan terperinci Bagaimanakah saya Boleh Isih std::map mengikut Nilai Daripada Kunci?. 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