C++容器map按值(value)排序

问题描述

c++ STL中的map会根据key进行自动排序,但某些场合需要根据value进行排序。例如,算法题字符统计

描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
数据范围:字符串长度满足 1≤len(str)≤1000
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
示例1
输入:
aaddccdc
输出:
cda
说明:
c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.

这种场景非常适合使用map容器记录每个字符出现的次数,然后针对出现次数进行降序排列,输出对应字符即可。但如何对value进行排序呢?


解决方案:

本篇记录一种结合vector容器和sort()函数的方法:

#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main() {

    // 1.构造一个符合背景问题的map
    map<char, int> m;
    m['a'] = 2;
    m['c'] = 3;
    m['b'] = 1;     // 此时m已根据key自动升序排列,即 m={'a':2, 'b':1, 'c':3}

    // 2.根据map构造一个vector数组
    vector<pair<char, int>> v(m.begin(), m.end());      // v有序排列

    // 3.调用头文件<algorithm>中的sort()或者stable_sort()排序函数,,二者调用方式相同
    // stable_sort()具有排序稳定性,此处以它为例,降序排列
    stable_sort(v.begin(), v.end(), [](const pair<char, int>& a, const pair<char, int>& b) {
        return a.second > b.second;
    });			// 仿函数形参中的const关键字不可省略,否则报错

    // 4.打印输出
    for (auto i : v) {
        cout << i.first << " " << i.second << endl;
    }

    return 0;
}

输出结果:
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值