C++中map按照从大到小的顺序存储元素

map按照从大到小存储元素

  • 引言
  • map的大致介绍
    • 概述
  • 场景
    • 误区
    • 示例
      • 示例代码(方法一)
      • 运行结果
      • 示例代码二(方法二)
      • 运行结果

引言

在对map的使用中,由于对业务的需要,希望map中存储元素能够按照键的大小从大到小的顺序递减存储元素,但之前没有对这块进行了解,只是想当然的使用sort来对map中的元素进行排序,但是不能这样操作的。
本文记录如何对map中的元素按照键的大小从大到小进行递减的存储元素。

map的大致介绍

概述

map是C++标准容器中的一种,也是一种关联容器,用于存储键值对,内部使用红黑树实现,可以快速查找和插入。其存储的元素默认按照键的大小从小到大的递增。

场景

由于map中存储的元素默认是按照键的值从小到大的顺序进行存储的,但是业务却希望map能够按照键的值从大到小的顺序存储元素。

误区

我的第一反应是使用sort函数来对map进行排序,但是后来发现sort排序后编译器编译不通过,反复修改折腾,最后才知道sort函数要求传入的容器迭代器类型为随机访问迭代器。而只有vector,deque和array等序列容器可以通过sort排序

示例

本例子是一个map我想把内部的元素按照键的值从大到小的顺序存储。

示例代码(方法一)

第一种方法是通过一个类,在类中实现一个仿函数,仿函数主要是实现比较键的大小,使mapd的键按照我们预期的顺序排序。下面是示例代码。
main.cpp

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

struct mapSort 
{
    bool operator() (const int& a,const int& b) const
    {
        return a > b;
    }
};

map<int, string, mapSort> hashPair = { {1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"},
                             {100, "C"},  {90, "XC"},  {50, "L"},  {40, "XL"},
                             {10, "X"},   {9, "IX"},   {5, "V"},   {4, "IV"},
                             {1, "I"} };

class Solution {
public:
    void printPairs() 
    {
        for (const auto& var:hashPair)
        {
            cout << "key:" << var.first << "value:" << var.second << endl;
        }
        cout << "==========================" << endl;
    }
    Solution() 
    {
        printPairs();
    }
    string intToRoman(int num) {
        string strValue;
        for (const auto& /*[value, symble]*/var : hashPair) {
            int value = var.first;
            string symble = var.second;
            while (num >= value) {
                num -= value;
                strValue += symble;
            }
            if (num == 0) {
                break;
            }
        }
        return strValue;
    }
};

int main()
{
    Solution obj;
    // 3 58 1994
    cout<<"input 3,and ouput :"<<obj.intToRoman(3)<<endl;
    cout << "input 58,and ouput :" << obj.intToRoman(58) << endl;
    cout << "input 1994,and ouput :" << obj.intToRoman(1994) << endl;
    std::cout << "Hello World!\n";
}

上述代码中,map<int,string>的键为int,若是按照键的值从大到小的顺序存储,需要定义个一个类或者结构体,在其中写一个仿函数bool operator() (const int& a,const int& b) const,通过这个仿函数来实现容器的键的比较,使其按照键的值从大到小的顺序的存储。定义map的时候,需要在键值类型的后面加上该类的名称,map<int, string, mapSort>其中mapSort就是仿函数实现键排序的类。这样map中的元素就可以按照键的值从大到小进行排序了。

运行结果

在这里插入图片描述

示例代码二(方法二)

第二种方法是定义一个函数,该函数与上述的仿函数功能一致,就是使map的键按照期望的顺序从大到小排序,然后将这个函数定义为一个函数指针,最终在定义map的时候,将函数指针座位参数传入。不过map的初始化就要放在后面单独进行了。

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

bool compare_map(const int& a, const int& b)
{
    return a < b;
}
bool(*fun)(const int&, const int&) = compare_map;
map<int, string, bool(*)(const int&, const int&)> hashPair(fun);

class Solution {
public:
    void printPairs() 
    {
        for (const auto& var:hashPair)
        {
            cout << "key:" << var.first << "value:" << var.second << endl;
        }
        cout << "==========================" << endl;
    }
    Solution() 
    {
        hashPair[1000] = "M";
        hashPair[900] = "CM";
        ...//这里省略部分插入操作,实则需要写上
        hashPair[1] = "I";
        printPairs();
    }
    string intToRoman(int num) {
        string strValue;
        for (const auto& /*[value, symble]*/var : hashPair) {
            int value = var.first;
            string symble = var.second;
            while (num >= value) {
                num -= value;
                strValue += symble;
            }
            if (num == 0) {
                break;
            }
        }
        return strValue;
    }
};

int main()
{
    Solution obj;
    // 3 58 1994
    cout<<"input 3,and ouput :"<<obj.intToRoman(3)<<endl;
    cout << "input 58,and ouput :" << obj.intToRoman(58) << endl;
    cout << "input 1994,and ouput :" << obj.intToRoman(1994) << endl;
    std::cout << "Hello World!\n";
}

bool compare_map(const int& a, const int& b)是比较函数,实现将map的键按照从大到小的顺序进行比较,后面定义了函数指针,map定义的时候指明了传入的函数指针,最后插入元素,被插入的元素会按照从大到小的顺序存储。

运行结果

在这里插入图片描述
以上可以参考博文:
https://blog.csdn.net/weixin_42686879/article/details/117092701

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/328562.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着pink老师前端入门教程-day03

6. 表格标签 6.1 表格的主要作用 主要用于显示、展示数据&#xff0c;可以让数据显示的规整&#xff0c;可读性非常好&#xff0c;特别是后台展示数据时&#xff0c;能够熟练运用表格就显得很重要。 6.2 基本语法 <!--1. <table> </table> 是用于定义表格的标…

别找进销存试用版了,直接送你一个免费的

很多朋友在找进销存的试用版&#xff0c;花了大量的时间找&#xff0c;找到了可能也只能用一两个月。我发现了一个免费的&#xff0c;直接送给你们。 这是一个大平台的引流系统&#xff0c;吸引客户用的&#xff0c;但是我们不管他&#xff0c;我们就直接用就行了。我已经用了…

echarts通过dataZoom实现单击图像滑动

实现原理; 1.option中配置初始化的dataZoom属性&#xff0c;并确定初始化数据展现位置 2.通过graphic属性配置图标及文本&#xff0c;并添加点击事件onclick&#xff1b; 3.通过dispatchAction的type: ‘dataZoom’&#xff0c;实现数据的最终展现。 效果&#xff1a;点击1图标…

定制聚四氟乙烯溢流釜出图灵活加工

您提供想法&#xff0c;我们负责实现。

2024年第二届“华数杯”国际大学生数学建模竞赛 (B题 ICM)| 光伏发电分析 |数学建模完整代码+建模过程全解全析

光伏发电是一种重要的可再生能源。将太阳能转化为电力可以减少对传统能源的依赖,具有显著的环保和可持续发展优势。全球范围内,光伏发电正在迅速发展。目前,许多国家将光伏发电作为推动清洁能源转型的重要手段。这些国家在政策支持、技术创新和市场发展方面增加了对光伏发电的投…

【windows】右键添加git bash here菜单

在vs 里安装了git for windows 后&#xff0c;之前git-bash 右键菜单消失了。难道是git for windows 覆盖了原来自己安装的git &#xff1f;大神给出解决方案 手动添加Git Bash Here到右键菜单&#xff08;超详细&#xff09; 安装路径&#xff1a;我老的 &#xff1f; vs的gi…

zabbix其他配置

自动发现 zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大。 systemctl disable --now firewalld setenforce 0 hostnamectl se…

统计学R语言实验4 均值假设检验

统计学R语言实验4 均值假设检验 一、实验目的 1. 掌握理解假设检验的相关概念。 2. 掌握理解假设检验的相关方法。 3. 熟悉R语言等语言的集成开发环境。 二、实验分析与内容 完成教材P88的第5题。 t检验统计量为-1.4628。显然当t较大时&#xff0c;说明x-相对于μ很小&a…

​Portkey AI网关:一个用来连接多种人工智能模型的开源工具

简介 它允许开发者通过一个简单的API接口来访问超过100种不同的大语言模型。包括OpenAI、Anthropic、Mistral、LLama2、Anyscale、Google Gemini等。安装体积只有45kb&#xff0c;处理速度提升了9.9倍&#xff0c;可以在多个不同的AI模型中来回切换。可以根据自己的需要进行灵…

外汇110:外汇交易中最常见的三种技术图表

不管做什么投资&#xff0c;我们都要学会分析趋势图&#xff0c;那么常见的技术图表有哪些&#xff0c;技术图表的作用是什么&#xff1f;下面就来一一分析&#xff1f;什么是技术图表&#xff1f; 对于投资人来说&#xff0c;掌握投资领域的市场趋势走向是十分重要&#xff0c…

跟着cherno手搓游戏引擎【7】Input轮询

在引擎程序中任何时间&#xff0c;任何位置都能知道按键是否按下、鼠标的位置等等信息。 与事件系统的区别&#xff1a;事件系统是在按下时调用并传递按键状态&#xff1b;轮询是每时每刻都能获取按键状态 创建基类&#xff1a; YOTO/Input.h&#xff1a;名如其意 #pragma …

九:day01_ 消息队列01

第一章 RabbitMQ 概念 1.1.1 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 1.1.2 消息 两台计算机间传送的数据单位。消息可以非常简单&#xff0c;例如只包含文本字符串&#x…

java web万能模板(附带防微博源码)

文章目录 java EE 项目万能模板套用创建一个java EE项目1.点击java ee2.点击finish3.一个Java ee项目创建完毕4.点击运行5.运行结果 万能模板连接数据库1.在pom.xml文件导入数据库连接所需要的依赖2.进行导入3. 导入以后刷新Maven4.找到 resources 文件。5.在resources的文件路…

​​社交媒体与新闻:Facebook在信息传播中的作用

社交媒体已经成为我们获取和传播新闻的主要渠道之一&#xff0c;而Facebook作为社交媒体的巨头&#xff0c;在信息传播中扮演着举足轻重的角色。本文将深入探讨社交媒体对新闻传播的影响&#xff0c;聚焦于Facebook在这一领域的独特作用&#xff0c;以及这种作用对我们的新闻体…

得物云原生容器技术探索与落地实践

一、前言 得物 App 作为互联网行业的后起之秀&#xff0c;在快速的业务发展过程中基础设施规模不断增长&#xff0c;继而对效率和成本的关注度也越来越高。我们在云原生技术上的推进历程如图所示&#xff0c;整体上节奏还是比较快的。 从 2021 年 8 月开始&#xff0c;我们以提…

Mr. Cappuccino的第69杯咖啡——Oracle之存储过程

Oracle之存储过程 准备数据PLSQL编程概念程序结构运行程序在DataGrip中运行DataGrip设置控制台输出打印内容 在sqlplus中运行sqlplus设置控制台输出打印内容 变量普通变量引用型变量记录型变量 流程控制条件分支循环 游标概念语法游标的属性创建与使用带参数的游标 存储过程概念…

【数据结构】——期末复习题题库(11)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

飞凌嵌入式这2款核心板已完成“矿鸿OS”适配,矿企伙伴看过来

近日&#xff0c;飞凌嵌入式FETA40i-C和FETMX6ULL-S两款核心板成功完成“矿鸿OS”的系统适配&#xff0c;嵌入式核心板与“矿鸿”操作系统的结合与应用&#xff0c;将进一步推动煤矿行业的数字化、智能化进程。 矿鸿OS&#xff08;矿山鸿蒙系统&#xff09;是华为和国家能源集团…

全自动网页制作系统流星全自动网页生成系统重构版输入网页信息即可制作

源码优点: 所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 免费制作 为用户使用方便考虑&#xff0c;全自动网页制作系统无需繁琐的注册与登入&#xff0c;直接…

Go后端开发 -- 面向对象特征:结构体 继承 多态 interface

Go后端开发 – 面向对象特征&#xff1a;结构体 && 继承 && 多态 && interface 文章目录 Go后端开发 -- 面向对象特征&#xff1a;结构体 && 继承 && 多态 && interface一、Go的结构体1.结构体的声明和定义2.结构体传参 二、将…
最新文章