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 1994cout<<"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 1994cout<<"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.mzph.cn/news/629243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依修改侧边栏

引用&#xff1a;https://blog.csdn.net/Sabrina_cc/article/details/125871591 子菜单选中后&#xff0c;文字和背景改变&#xff1a; .el-submenu__title i{color: #e8e8e8 !important;} #app .sidebar-container .theme-dark .nest-menu .el-submenu .is-active > .el-su…

C++设计模式(李建忠)笔记1

C设计模式&#xff08;李建忠&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考链接 Youtube: C设计模式 Gtihub源码与PPT&#xff1a;https://github.com/ZachL1/Bilibili-plus 豆瓣: 设计模式–可复用面向对象软件的基础 文章目录 C设计模…

探索单元测试和 E2E 测试:提升软件质量的关键步骤(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

修复系统和修复常见安卓问题的 10 个应用

我们都喜欢我们的 Android 智能手机&#xff0c;对吧&#xff1f;有很多值得喜欢的地方。 Android 手机易于使用且通常无故障&#xff0c;但毕竟它只是一台机器&#xff0c;偶尔也会出现问题。面对现实吧&#xff0c;我们的智能手机并不完美。用户经常遇到的一些常见 Android …

select子句简单查询

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 目录 数据查询 起别名 连接 ​编辑 去重 ​编辑 另外补充几个不常用的命令 如果要进行查询,那么需要使用数据操纵语言&#xff08;Data Manipulation Language&#xff0c;DML&am…

React Store及store持久化的使用

1.安装 npm insatll react-redux npm install reduxjs/toolkit npm install redux-persist2. 使用React Toolkit创建counterStore并配置持久化 store/modules/counterStore.ts&#xff1a; import { createSlice } from reduxjs/toolkit// 定义状态类型 interface Action {…

linux-部署Samba文件共享服务

linux-部署Samba文件共享服务 1、使用命令安装samba服务和samba客户端 dnf install samba samba-client # 或者 yum install samba samba-client2、配置文件的设置(可提前备份smb.conf) vim /etc/samba/smb.conf [global]workgroup SAMBAsecurity userpassdb backend tdbsam…

在EasyBoss ERP上查Shopee产品表现,数据更全、处理更高效!

在运营Shopee本土店的过程中&#xff0c;卖家需要及时了解产品数据来进行产品的调整和优化。不过&#xff0c;调整和优化需要基于数据&#xff0c;而非仅凭直觉。 但是&#xff0c;如何全面地查看产品表现数据、快速处理表现不佳的产品&#xff0c;成为诸多卖家头痛的问题&…

java的运行机制以及整体流程

背景&#xff1a;学习了这么多年的Java&#xff0c;把自己的理解写成JVM系列&#xff0c;以便于后面的温习&#xff0c;以及帮助更多的java开发人员。 开篇先梳理下&#xff0c;我们之前写的第一个Hello World&#xff01;&#xff0c;当我们运行出来后&#xff0c;在控制台打印…

史上最全的数据科学与艺术

1.背景介绍 数据分析是一种将数据转化为价值的艺术和科学。它涉及到大量的数学、统计、编程、数据库、机器学习等多个领域的知识。数据分析的目的是从数据中提取有用的信息&#xff0c;以便做出明智的决策。 数据分析的艺术体现在数据分析师需要具备丰富的经验和洞察力&#…

『C++成长记』内存管理

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、C/C内存分布 二、内存管理方式 &#x1f4d2;2.1C语言内存管理方式 &#x…

【OpenAI】自定义GPTs应用(GPT助手应用)及外部API接口请求

11月10日&#xff0c;OpenAI正式宣布向所有ChatGPT Plus用户开放GPTs功能 简而言之&#xff1a;GPT应用市场(简称GPTs, 全称GPT Store) Ps&#xff1a; 上图为首次进入时的页面&#xff0c;第一部分是自己创建的GPTs应用&#xff0c;下面是公开可以使用的GPTs应用 一、创建GPTs…

振弦采集仪在桥梁结构健康监测中的应用探索

振弦采集仪在桥梁结构健康监测中的应用探索 振弦采集仪是一种用于测量结构振动特性的仪器&#xff0c;通过采集结构上的振弦信号&#xff0c;可以评估结构的健康状况。在桥梁结构健康监测中&#xff0c;振弦采集仪可以发挥重要的作用。 首先&#xff0c;振弦采集仪能够实时监测…

上传文件:413 Request Entity Too Large Maximum upload size exceeded 解决方案

文章目录 前言一、原因分析二、解决方案1.nginx配置文件2.application.yml配置文件 总结 前言 在上传文件时&#xff0c;如果没有做一些配置的话&#xff0c;会导致上传失败&#xff1a;413 Request Entity Too Large 或者 Maximum upload size exceeded。 提示&#xff1a;以…

geemap学习笔记049:下载Landsat数据时遇到的一个问题

前言 最近在下载Landsat 8 地面反射率数据&#xff08;Surface Reflectance&#xff09;时&#xff0c;遇到了一个问题&#xff0c;无论是使用geemap.ee_export_image_to_drive() 函数还是geemap.download_ee_image() 函数下载的数据&#xff0c;易康都打不开&#xff0c;显示…

【Java】面向对象 OOP

文章目录 面向对象OOP概述一、对象内存相关二、类的成员之一&#xff1a;成员变量&#xff08;Field&#xff09;2.1 如何声明成员变量2.2 成员变量 与 局部变量 三、类的成员之一&#xff1a;成员方法&#xff08;Method&#xff09;3.1 方法调用内存分析3.2 方法的重载3.3 可…

NAS入门(学习笔记)

文章目录 AutoMLNAS初期NAS当前NAS框架One-Shot NAS权重共享策略 Zero-Shot NASZen-NASNASWOTEPENAS 参考资料 AutoML 深度学习使特征学习自动化 AutoML 使深度学习自动化 自动化机器学习 (automated machine learning) 是一种自动化的数据驱动方法, 并做出一系列决策。 按…

第2、3次作业

题目1&#xff1a; 基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 题目2&#xff1a; 给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com/student](http://www.openlab.c…

RIP【新华三与华为区别】

【介绍】 rip分为rip 1 与 rip 2 &#xff0c;rip 2 是对 rip 1 的一种升级&#xff0c;rip 2 可以进行认证等功能 【命令】 新华三&#xff1a; [HC3-R1] rip #启用rip [HC3-R1-rip] version 2 #告知rip 版本号 [HC3-R1-rip] network 192.168.1.0 #宣告其网段 [HC3-R1-rip] …

【python】py-spy 实时显示python进程内的线程堆栈CPU消耗 python CPU消耗分析

安装 pip install py-spy AI调用源码&#xff0c;红色调用时&#xff0c;python进程CPU 100% 启动程序&#xff0c;输入问题&#xff0c;观察CPU top sudo .local/bin/py-spy top --pid 7150 可以看到&#xff0c;此时与显卡交互占用了绝大部分CPU&#xff0c;有点死循环检测…