我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++中地图按键排序实现示例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++中地图按键排序实现示例

正文

一个地图由键/值对组成。每一对都是一个元素。一个地图中的所有键都是唯一的。一个地图可以按键进行排序。排序可以是升序或降序。升序是默认的。地图中的排序并不总是直接的。它需要一个比较函数对象。如果比较对象被忽略了,就会发生默认的排序。

如果键是恒定的指向字符的指针,地图就会按键的指针排序,而不是按键的字符串字数排序。这几乎不是任何人想要的。考虑以下水果的键/值对和它们的外部颜色。

    "plum" => "purple"
    "blackberry" => "dark blue-black"
    "watermelon" => "green"
    "apricot", => "orange"
     "papaya" => "orange"
    "banana" => "yellow"

水果是键,而颜色是值。这个元素列表(键/值对)是没有排序的。下面的程序创建了这个列表的映射,并按原样显示,没有按字符串字面排序。

 #include <iostream>
    #include <map>
    using namespace std;
    int main()
    {
        map<const char*, const char*> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        for (map<const char*, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

输出结果是:

 plum => purple
    blackberry => dark blue-black
    watermelon => green
    apricot => orange
    papaya => orange
    banana => yellow

未按字符串字面排序,但按指针排序。要在C++程序中使用地图,必须用include指令来包含地图库。

创建上述简单地图的另一种方法是如下。

 #include <iostream>
    #include <map>
    using namespace std;
    int main()
    {
        map<const char*, const char*> mp({{"plum","purple"}, {"blackberry","dark blue-black"}, {"watermelon","green"}, {"apricot","orange"}, {"papaya","orange"}, {"banana","yellow"}});
        for (map<const char*, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

输出结果是:

 plum => purple
    blackberry => dark blue-black
    watermelon => green
    apricot => orange
    papaya => orange
    banana => yellow

未按字符串字面排序,但按指针排序。如果键值是整数,输出将按键值排序。在实践中,许多地图的键是字符串字面。这篇文章解释了字符串字面的键是如何对地图进行排序的。

创建过程中的排序

构建地图的完整模板是:

template<class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T>>> class map;

类,Compare和Allocator,有默认值。也就是说,它们有默认的专业化,不必在map声明(实例化)中进行类型化。这里要关注的是比较类。这个类的名字是Compare,默认的特殊化是 "less"。"less<Key "意味着按升序排序。另一个选项是 "greater",意思是降序排序。

一个地图在创建时通常是按键值排序的。如果键是const char*,那么指向引号字面字符串的指针将被排序,而不是字面文本。要在创建过程中把字符串作为键进行排序,字符串必须是由字符串类实例化的字符串对象的字面意思。这意味着必须包括字符串库和地图库。

创建升序

在下面的程序中,地图被创建,升序排序。

 #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*, less<string>> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        for (map<string, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

输出结果是:

apricot => orange
    banana => yellow
    blackberry => dark blue-black
    papaya => orange
    plum => purple
    watermelon => green

即使模板中省略了less,排序仍然会是升序的,因为less是默认的。

创建降序

为了创建一个地图,使其按键的降序排序,必须对比较专业化进行编码。下面的程序说明了这一点。

 #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*, greater<string>> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        for (map<string, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

输出结果是:

 watermelon => green
    plum => purple
    papaya => orange
    blackberry => dark blue-black
    banana => yellow
    apricot => orange

生成一个范围的降序

一个地图的范围可以按降序产生。这涉及到创建第二个地图,它是第一个地图的一个范围。下面的程序说明了这一点。

 #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        map<string, const char*>::iterator itB = mp.begin();
        itB++;
        map<string, const char*>::iterator itE = mp.end();
        itE--;
        map<string, const char*, greater<string>> mpR(itB, itE);
        for (map<string, const char*>::iterator it = mpR.begin(); it != mpR.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

输出结果是:

 plum => purple
    papaya => orange
    blackberry => dark blue-black
    banana => yellow

第一个地图对象有六个元素,分别是

apricot => orange
    banana => yellow
    blackberry => dark blue-black
    papaya => orange
    plum => purple
    watermelon => green

考虑的范围是:

 banana => yellow
    blackberry => dark blue-black
    papaya => orange
    plum => purple
    watermelon => green

在代码中,"itB++"指向{"香蕉","黄色"},"itE-"指向{"西瓜","绿色"}的范围。在C++中处理一个范围时,最后一个元素不参与操作。于是,输出有四个元素,{"西瓜","绿"}被省略了。

第二个map的Compare模板参数的特化是 greater。如果它是less或者省略,那么这个范围会导致升序。

通过键比较两个元素

key_compare key_comp() const

这个成员函数返回map容器用来比较键的比较对象的副本。比较对象是一个函数对象。它将把两个键作为参数,如果左键小于右键,则返回真。有了这个,代码段应该是。

 key_compare kc = mp.key_comp();
 bool bl = kc("watermelon", "apricot");

key_compare不被编译器识别。在这个代码段中消除key_compare,在第二条语句中替换掉kc,结果是。

bool bl = mp.key_comp()("watermelon", "apricot");

下面的程序说明了key_comp()的使用。

#include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        bool bl = mp.key_comp()("watermelon", "apricot");
        cout << bl << endl;
        return 0;
    }

输出结果是0,表示错误。

上述代码段的真正问题是,key_compare的命名空间没有得到很好的表达。如果这段代码是

 map<string, const char*>::key_compare kc = mp.key_comp();
 bool bl = kc("watermelon", "apricot");

它本来可以工作(被编译器接受)。

value_compare value_comp() const

这个成员函数与key_comp()类似。注意:这里指的不是键/值对的值,而是键/值对的元素。所以,value_compare函数对象的两个参数是迭代器元素。下面的程序使用value_comp(),在比较第一个和最后一个元素,{"杏","橙"}和{"西瓜","绿"}:

    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*, less<string>> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        map<string, const char*>::iterator itB = mp.begin();
        map<string, const char*>::iterator itE = mp.end();
        itE--;
        map<string, const char*>::value_compare vc = mp.value_comp();
        bool bl = vc(*itB, *itE);
        cout << bl << endl;
        return 0;
    }

输出是1,表示真。迭代器itB和itE被解读为有它们的元素,用的是嵌套运算符。

对用初始化器列表创建的地图进行排序

在下面的程序中,排序是降序的,键是字符串对象,从字符串类实例化出来。

    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    int main()
    {
        map<string, const char*, greater<string>> mp({{"plum","purple"}, {"blackberry","dark blue-black"}, {"watermelon","green"}, {"apricot","orange"}, {"papaya","orange"}, {"banana","yellow"}});
        for (map<string, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

输出结果是。

    watermelon => green
    plum => purple
    papaya => orange
    blackberry => dark blue-black
    banana => yellow
    apricot => orange

结论

一个地图的创建是按照键来排序的,升序。升序是默认的顺序。要想让它降序,请在模板参数列表中加入模板参数的特殊化,即作为第三个参数的大号。注意:如果键值是字符串,它们必须从字符串类中实例化出来,如上图所示。作为const-char*或char-arr[]的字符串键,其指针最终会被排序,而不是其字面意义。

以上就是C++中地图按键排序实现示例的详细内容,更多关于C++地图按键排序的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++中地图按键排序实现示例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

c++实现堆排序的示例代码

本文主要介绍了c++实现堆排序的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-02

C++中位图的实现示例

这篇文章主要介绍C++中位图的实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用
2023-06-15

Java编程实现汉字按字母顺序排序的方法示例

本文实例讲述了Java编程实现汉字按字母顺序排序的方法。分享给大家供大家参考,具体如下:String[] str0 = new String[]{"abd","ervcd","sdfc","abdc","sded","生活","文教","政
2023-05-31

C语言实现经典排序算法的示例代码

这篇文章主要为大家详细介绍了如何利用C语言实现经典排序算法中的冒泡排序、选择排序、插入排序、希尔排序,文中的示例代码讲解详细,需要的可以参考一下
2022-11-13

Java TreeSet实现学生按年龄大小和姓名排序的方法示例

本文实例讲述了Java TreeSet实现学生按年龄大小和姓名排序的方法。分享给大家供大家参考,具体如下:import java.util.*;class Treeset{ public static void main(String[]
2023-05-31

计算机网络中JAVA实现快速排序的示例

小编给大家分享一下计算机网络中JAVA实现快速排序的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java的特点有哪些Java的特点有哪些1.Java语言作为
2023-06-15

微信小程序中的轮播图实现示例

打开一个小程序,我们会发现,一般构图排版都是图片banner-快捷按钮-产品/文章列表等详细信息,底部导航一般是2~5个。这样的排版是比较美观的,那么为什么要这样设计,这些轮播图、快捷按钮等小程序组件都有什么用呢?接下来就带你详细了解下
2022-12-22

C#/VB.NET实现从PPT中提取图片的示例代码

PPT是用于制作幻灯片(演示文稿)的应用软件,每张幻灯片中都可以包含文字、图形、图形、表格、声音和影像等多种信息。本文主要介绍了如何实现从PPT中提取图片的功能,需要的可以参考一下
2023-03-14

uniapp小程序使用高德地图api实现路线规划的示例代码

路线规划常用于出行路线的提前预览,我们提供4种类型的路线规划,分别为:驾车、步行、公交和骑行,满足各种的出行场景,这篇文章主要介绍了uniapp小程序使用高德地图api实现路线规划,需要的朋友可以参考下
2023-01-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录