C ++ STL | 根据值而不是键对映射排序

C ++ STL中的映射通常根据其键进行排序。但是在某些情况下,我们需要根据值对映射进行排序。在本文中,我们将讨论如何根据值而不是键对映射进行排序。

在详细介绍之前,让我们以一个示例问题来了解何时需要基于值而不是键进行排序。

一个非常普遍的问题是根据频率对数组或列表进行排序。我们在此处所做的操作将创建映射以存储频率。现在,根据键对映射进行排序,但是我们要求根据值对映射进行排序。那么我们能做什么?

我们可以使用优先级队列和自己的比较器功能对映射进行排序。在阅读本文之前,请仔细阅读我们有关如何在C ++ STL中为优先级队列定义比较器的文章。

映射的元素是什么?

假设映射是<T,T>,其中T可以是任何数据类型
。映射的每个元素都是对<T,T>

使用STL的优先级队列的语法:

priority_queue<T,vector<T>,decltype(comp)> pq(comp);

其中T是元素的通用类型,comp是比较器函数
因此,在map的情况下,它将是

priority_queue<pair<T,T>,vector< pair<T,T>>,decltype(comp)> pq(comp);

由于pair <T,T>是map元素

现在,我们可以根据需要的逻辑定义比较器功能。

现在开始讨论基于值排序的问题。如果两个键的值是基于键的相同排序。

假设映射是map <int,int> mymap

Key	value
1	6
2	8
6	3
9	8

检查下面的代码以查看详细的实现,并输出以查看已排序的映射。

C ++程序根据值而不是键对映射进行排序

#include <bits/stdc++.h>
using namespace std;

void sort_map_on_value(map<int, int> mymap)
{
    //比较器lambda函数
    auto comp = [](pair<int, int> a, pair<int, int> b) {
        //比较逻辑
        //如果第一个元素的值大于 
        //无需交换
        if (a.second > b.second)
            return false;
        //如果第一个元素的值小于 
        //需要交换
        else if (a.second < b.second)
            return true;
        else { //当值相同时
            if (a.first < b.first) {
                return false;
            }
            else
                return true;
        }
    };

    priority_queue<pair<int, int>, vector<pair<int, int> >, decltype(comp)> pq(comp);

    for (auto& ij : mymap) {
        pq.push(ij);
    }
    //打印排序的映射
    cout << "key value\n";
    while (!pq.empty()) {
        cout << pq.top().first << " " << pq.top().second << endl;
        pq.pop();
    }
}

void print(map<int, int> mymap)
{
    cout << "key value\n";
    for (auto & [ key, value ] : mymap)
        cout << key << " " << value << endl;
}

int main(){
    map<int, int> mymap;
 
    mymap[1] = 6;
    mymap[2] = 8;
    mymap[6] = 3;
    mymap[8] = 2;
 
    cout << "before sorting map is:\n";
    print(mymap);
 
    cout << "after sorting based on value map is: \n";
    sort_map_on_value(mymap);

    return 0;
}

输出:

before sorting map is:
key value
1 6
2 8
6 3
8 2
after sorting based on value map is:
key value
2 8
1 6
6 3
8 2