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

这篇具有很好参考价值的文章主要介绍了C++中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中的元素就可以按照键的值从大到小进行排序了。

运行结果

C++中map按照从大到小的顺序存储元素,C++,c++,开发语言

示例代码二(方法二)

第二种方法是定义一个函数,该函数与上述的仿函数功能一致,就是使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定义的时候指明了传入的函数指针,最后插入元素,被插入的元素会按照从大到小的顺序存储。

运行结果

C++中map按照从大到小的顺序存储元素,C++,c++,开发语言
以上可以参考博文:
https://blog.csdn.net/weixin_42686879/article/details/117092701文章来源地址https://www.toymoban.com/news/detail-797519.html

到了这里,关于C++中map按照从大到小的顺序存储元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 键盘录入10个数,并对这10个数用选择法和冒泡法从大到小排序

    首先因为要用键盘录入10个数,要用到Scanner,所以先创建一个Scanner类;(注意使用Scanner类要导包)具体代码如下: 因为要录入10个元素所以接着创建一个长度为10的数组,对录入的数据进行存储;实现代码如下: 数组定义完成之后,利用循环结构键盘录入10个数据存储到元素

    2024年02月03日
    浏览(44)
  • HBase 表如何按照某表字段排序后顺序存储的方法?

    首先需要明白HBase表的排序规则: (1)rowkey排序(字典排序)——升序 (2)Column排序(字典排序)——升序 (3)时间戳排序——降序 rowkey 字典序排序可点击下方链接了解。 [HBase] - 理解 HBase Rowkey 字典排序 https://www.jianshu.com/p/d4609b5bb9f3 如果想按照某列字段来排序,则需要

    2024年02月07日
    浏览(54)
  • C算法:使用选择排序实现从(大到小/从小到大)排序数组,且元素交换不可使用第三变量。

    需求: 使用选择排序实现从(大到小/从小到大)排序,且元素交换不可使用第三变量 (异或交换法) 代码实现: 打印:

    2024年02月08日
    浏览(45)
  • c++一级 输入三个数,按照从小到大的顺序输出

    这个题是2022年9月份c++一级的真题,它说难不难,说不难也难,评判标准主要看学生学到哪种程度以及 使用的是哪种方法。 首先来看用最基础的判断怎么做: 这是用 排列组合 的方式来做,有的同学也会直接两两个数进行判断,但那样实在太麻烦了,需要写很多层循环嵌套。

    2024年02月15日
    浏览(59)
  • OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

    在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。 例如,一张形状为256×256×3的RGB图像,在OpenCV中读取后的格式为[256, 256, 3],其中最后一个维度表示图像的通道数。在OpenCV中,可以通

    2024年02月04日
    浏览(38)
  • 从大数据到AI,华为云存储加速企业大模型快速应用

    摘要: AI与大数据算法不断发展,在生产中的应用也越来越广,而应用的场景除了对算法,软件架构要求越来越高外,也对底层IaaS(基础设施即服务)提出了新的挑战。 AI与大数据算法不断发展,在生产中的应用也越来越广,而应用的场景除了对算法,软件架构要求越来越高

    2024年02月15日
    浏览(47)
  • c#让三个线程按照顺序执行

    三个线程都是while(true)的循环体 A线程:采集数据 B线程:画曲线 C线程:存数据库 AutoResetEvent 是一个线程同步的类,它提供了一种机制,允许一个或多个线程等待直到接收到信号,然后继续执行。 以下是 AutoResetEvent 的一些常用成员: WaitOne() :使当前线程等待接收信号。

    2024年02月02日
    浏览(35)
  • C# 多线程交替按照指定顺序执行

    1.关于AutoResetEvent和ManualResetEvent的区别解释如下: AutoResetEvent和ManualResetEvent是.NET中的两个线程同步类。它们之间的主要区别在于其释放信号的方式以及对等待线程的影响。 AutoResetEvent的作用是在等待的线程被信号唤醒后,将信号自动重置为非终止状态。也就是说,当一个线程

    2024年02月11日
    浏览(37)
  • sql的order by 按照自定义的顺序排列

    SQL 的 ORDER BY 子句可以按照自定义的顺序进行排列。 可以使用 CASE 表达式来指定自定义的排序顺序。以下是一个示例: 假设我们有一个表格 students 包含字段 name 和 grade ,我们想按照自定义的顺序对 name 字段进行排序,可以这样写: 使用了 CASE 表达式来为每个名字指定一个数

    2024年02月20日
    浏览(35)
  • python按照windows或者Ubuntu的文件夹中文件的顺序读取文件

    在使用python读取文件的时候,发现python读取文件的顺序和文件夹中的顺序不一致,这时候应该怎么办呢? 使用os_sorted库,安装方式: 使用方法: 本专栏是讲解如何改进Yolov8的专栏。改进方法采用了最新的论文提到的方法。改进的方法包括:增加注意力机制、更换卷积、更换

    2024年02月07日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包