map容器(20221125)

news/2024/4/30 2:01:57/文章来源:https://blog.csdn.net/qq_60143666/article/details/128040776

一、map/multimap容器

1、map基本概念

map中所有元素都是pair;

pair第一个元素为key(键值),起到索引的作用,第二个元素为value(实值);

所有元素会根据元素的键值(key)自动排序。

map/multimap实质都属于关联式容器 底层结构为二叉树

优点:

可以根据key值快速找到value值

map/multimap区别:

map中不允许有重复的key值,multimap中可以有。

2、构造和赋值

map<T1,T2>mp; //默认构造

map(const map &mp); // 拷贝构造

map& operator=(const map&mp); //赋值重载=操作符

void printMap(map<string, int>&mp){for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++){cout << "key = " << (*it).first << " value=" << (*it).second << endl;}}void test01(){map<string,int>mp;mp.insert(pair<string, int>("张三", 19)); //插入时必须要先创建一个对组mp.insert(pair<string, int>("张四", 20)); //插入时必须要先创建一个对组mp.insert(pair<string, int>("张五", 21)); //插入时必须要先创建一个对组mp.insert(pair<string, int>("张六", 10)); //插入时必须要先创建一个对组printMap(mp);//拷贝构造map<string, int>mp1(mp);cout << "mp1:" << endl;printMap(mp1);//赋值map<string,int>mp2;mp2 = mp1;cout << "mp2:" << endl;printMap(mp2);}

2、map的大小和交换

函数原型:

size();

empty();

swap(st);

用法与其它容器相同

3、map插入和删除

函数原型:

insert(elem);

clear();

erase(pos);

erase(beg,end);

erase(key); //删除容器中值为key的元素

用法与其他容器相同

void test02(){map<string, int>mp2;mp2.insert(pair<string, int>("B", 19)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("C", 20)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("A", 21)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("D", 10)); //插入时必须要先创建一个对组mp2.insert(make_pair("E", 23));//第三种插入mp2.insert(map<string, int>::value_type("M", 20));//第四种插入mp2["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值valueprintMap(mp2);//删除cout << "删除第一个元素" << endl;mp2.erase(mp2.begin());printMap(mp2);cout << "删除key为M的元素" << endl;mp2.erase("M"); //按key的方式删除printMap(mp2);cout << "清空元素" << endl;mp2.clear();printMap(mp2);}

5、map的查找与统计

find(key);//查找key是否存在,若存在 则返回元素的迭代器,不存在,则返回map.end();

count(key);//统计key的元素个数

用法与set的查找与统计相同。

void test03(){map<string, int>mp2;mp2.insert(pair<string, int>("B", 19)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("C", 20)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("A", 21)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("D", 10)); //插入时必须要先创建一个对组mp2.insert(make_pair("E", 23));//第三种插入mp2.insert(map<string, int>::value_type("M", 20));//第四种插入mp2["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值value//查找map<string,int>::iterator pos = mp2.find("B");//返回的是迭代器 用迭代器接收if (pos != mp2.end()){cout << "元素存在,其实值为:"<< (*pos).second<< endl;cout << "其个数为: " << mp2.count("B") << endl;}else{cout << "元素不存在!" << endl;}}

6、map容器的排序规则

class MyCompare {public:bool operator()(string v1, string v2)const //重载()  需要加一个const 否则会报错{return v1 > v2;}};void test04(){map<string, int>mp2;mp2.insert(pair<string, int>("B", 19)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("C", 20)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("A", 21)); //插入时必须要先创建一个对组mp2.insert(pair<string, int>("D", 10)); //插入时必须要先创建一个对组mp2.insert(make_pair("E", 23));mp2.insert(make_pair("E", 28));//第三种插入mp2.insert(map<string, int>::value_type("M", 20));//第四种插入mp2["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值value//查找map<string, int>::iterator pos = mp2.find("B");//返回的是迭代器 用迭代器接收if (pos != mp2.end()){cout << "元素存在,其实值为:" << (*pos).second << endl;cout << "其个数为: " << mp2.count("B") << endl;}else{cout << "元素不存在!" << endl;}cout << "默认排序为:" << endl;printMap(mp2);cout << "自己定义排序插入后:" << endl;map<string, int,MyCompare>mp3;mp3.insert(pair<string, int>("B", 19));mp3.insert(pair<string, int>("C", 20));mp3.insert(pair<string, int>("A", 21));mp3.insert(pair<string, int>("D", 10));mp3.insert(make_pair("E", 23));mp3.insert(make_pair("E", 28));mp3.insert(map<string, int>::value_type("M", 20));mp3["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值valuefor (map<string, int, MyCompare>::iterator it = mp3.begin(); it != mp3.end(); it++){cout << "key为: " <<it->first << " value为:" << (*it).second << endl;}}

也可以不用定义MyCompare类,直接用greater<string> ,其中string表示比较string的大小

    map<string, int,greater<string>>mp3;mp3.insert(pair<string, int>("B", 19));mp3.insert(pair<string, int>("C", 20));mp3.insert(pair<string, int>("A", 21));mp3.insert(pair<string, int>("D", 10));mp3.insert(make_pair("E", 23));mp3.insert(make_pair("E", 28));mp3.insert(map<string, int>::value_type("M", 20));mp3["F"] = 30;//不建议 ,可以用这个方式访问键值为key的实值valuefor (map<string, int>::iterator it = mp3.begin(); it != mp3.end(); it++){cout << "key为: " <<it->first << " value为:" << (*it).second << endl;}

注意map容器只能通过键值大小来进行排序,不能通过实值的大小来进行排序,若需要通过实值大小排序,可以转为其他容器来实现,如vecter, vecter<pair<int,int>>。

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

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

相关文章

【自学前端】HTML篇已完结(附14节视频)

I have a dream,Front end development will not require additional training. 目录 内容预览 通过这里找视频&#xff1a; 1、内容仍然有所欠缺 2、目前以0基础再实战为主 3、目前未包含面试题 4、下一步的计划 5、希望收到反馈 内容预览 △ 目前纯HTML篇课程已经完成…

[足式机器人]Part3机构运动微分几何学分析与综合Ch02-2 平面机构离散运动鞍点综合——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch02-2 平面机构离散运动鞍点综合2.3 鞍点圆2.3.1 鞍圆与二副连架杆R-R2.3.2 鞍圆误差2.3.3 四位置鞍圆2.3.4 五位置鞍圆2.3.5 多位置鞍圆2.3 鞍点圆 平面连杆机构中…

第五站:操作符(第二幕)

在前面的文章中我们详细讲解了操作符的一些内容&#xff0c; 今天我们来继续了解操作符剩余的内容 操作符第一幕的传送门在这&#xff1a;第五站&#xff1a;操作符&#xff08;第一幕&#xff09; 目录 七、关系操作符 八、逻辑操作符 1.基础知识 2.几道经典的题目 九、条…

手摸手教会你在idea中配置Tomcat进行servlet/jsp开发(多图超详)

1. 下载安装idea&#xff0c;创建project&#xff0c;如果没有JDK可以通过idea指定文件夹并下载JDK。工程就是普通的Java工程&#xff0c;名字为webdemo 2.因为是Web项目&#xff0c;所以要对这个普通的项目进行WEB扶持^^&#xff0c;在项目名称webdemo上右键单间选择菜单项&qu…

20221125使用PR2023自动识别obs-studio录屏生成的MKV视频的字幕

20221125使用PR2023自动识别obs-studio录屏生成的MKV视频的字幕 2022/11/25 19:07 01 obs.png obs studio &#xff08;64bit&#xff09; 02 obs 设置.png 03 obs 输出.png 04 obs默认为MKV.png 05 obs改mkv为MP4.png 警告&#xff1a;如果文件无法完成&#xff08;例如&…

嵌入式驱动初级-阻塞与非阻塞

文章目录前言一、五种IO模型二、阻塞与非阻塞三、多路复用前言 记录嵌入式驱动学习笔记 一、五种IO模型 当应用程序对设备驱动进行操作的时候&#xff0c;如果不能获取到设备资源&#xff0c;那么阻塞式 IO 就会将应用程 序对应的线程挂起&#xff0c;直到设备资源可以获取为止…

b站黑马JavaScript的Ajax案例代码——图书管理案例

目录 目标效果&#xff1a; 重点原理&#xff1a; 1.js数组操作中push方法 2.jquery中append方法 3.js数组操作中join方法 4.jQuery中attr方法 5.jQuery中trim方法 代码部分&#xff1a; 1. 图书管理案例.html(js部分全是重点&#xff0c;html部分用于看结构) 2.jquery.js…

mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)

mybatis复习05,mybatis的缓存机制&#xff08;一级缓存和二级缓存&#xff09;MyBatis的缓存机制MyBatis的一级缓存MyBatis的二级缓存二级缓存的相关配置MyBatis缓存查询的顺序整合第三方缓存EHCacheEHCache配置文件说明&#xff1a;MyBatis的缓存机制 MyBatis作为持久化框架&…

什么是DCS系统?DCS和SCADA的区别

如果你在工业自动化的企业环境中操作&#xff0c;可能听说过分布式控制系统 (DCS) 和监控和数据采集 (SCADA) 系统。 DCS系统和SCADA系统有很多共同点&#xff0c;因为它们都被称为受控计算机系统&#xff0c;接收和评估合法数据以实现远程访问监控和管理。 DCS(分布式控制系…

Flutter 中使用 extension 使项目更具可读性和效率 01

Flutter 中使用 extension 使项目更具可读性和效率 01 原文 https://medium.com/bedirhanssaglam/make-your-flutter-projects-more-readable-and-effective-with-extensions-b7dffd32e2f4 前言 代码的可读性和实用性在《 Flutter 》中非常重要。今天我们将编写一些 extension …

体系结构27_多处理机(1)

单处理机的发展正在走向尽头&#xff1f; 并行处理机在未来将会发挥更大的作用。 1.获得超过单处理器的性能&#xff0c;最直接的方法就是把多个处理器连在一起。 2.自1985年以来&#xff0c;体系结构的改进使性能迅速提高&#xff0c;这种改进的速度能否持续下去还不清楚&a…

信号类型(雷达)——雷达波形认识(一)

系列文章目录 《信号类型&#xff08;雷达通信&#xff09;》 文章目录 前言 简述 总结 前言 本文将结合个人研究经验&#xff0c;从雷达波形简单谈谈我对雷达的认识。之后将对常见的雷达波形进行简单分析。 简述 雷达的波形决定了信号处理的手段以及对应的雷达功能&#x…

体系结构29_多处理机的互联网络

互连网络是将集中式系统或分布式系统中的结点连接起来所构成的网络&#xff0c;这些结点可能是处理器、存储模块或者其它设备&#xff0c;它们通过互连网络进行信息交换。在拓扑上&#xff0c;互连网络为输入和输出两组结点之间提供一组互连或映象&#xff08;mapping&#xff…

【Linux】进程创建/终止/等待/替换

目录 一、子进程的创建 1、fork函数的概念 2、如何理解fork拥有两个返回值 3、fork调用失败的场景 二、进程的终止 1、main函数返回值 1.1main函数的返回值的意义 1.2将错误码转化为错误信息 1.3查看进程的退出码 2、进程退出的情况 1、进程的正常退出与异常退出 2…

Nodejs中包的介绍及npm安装依赖包的多种方法

文章目录1 包的介绍1.1 什么是包1.2 包的来源1.3 为什么需要包1.4 从哪里下载包1.5 如何下载包2 npm2.1 npm安装依赖包2.2 装包后多了哪些文件2.3 安装指定版本的包1 包的介绍 1.1 什么是包 Nodejs中的第三方模块又叫做包 就像电脑和计算机指的是相同的东西&#xff0c;第三…

推特自动发帖,全天占据核心流量

利用热门趋势和Hashtags标签 Twitter有一个热门趋势&#xff0c;跟微博热搜是差不多的&#xff0c;卖家可以多关注一下热门趋势&#xff0c;看看有没有和产品相关的内容。在帖子中加入趋势性和热门的标签&#xff0c;是一种非常好的营销方式。 这一方面能够增加推文的热度&am…

android源码-ContentProvider实现原理分析

前言&#xff1a; 最初的目的是想研究下ContentProvider产生ANR原因的&#xff0c;但是如果要讲ANR的原因&#xff0c;那么必须要了解ContentProvider的完整实现原理&#xff0c;所以本篇就先讲一下ContentProvider的实现原理&#xff0c;下一篇再去讲ANR的原因。 本篇主要会讲…

Baklib知识库|为什么知识共享工具对减少内部知识缺口至关重要

你的企业是否存在知识缺口&#xff1f; 知识缺口——没有对关键知识进行研究和记录&#xff0c;以有效地传播信息&#xff0c;并教育企业内外的用户——可能是寻求生产率最大化并最终实现利润增长的公司的一个关键缺陷。知识&#xff08;或数据、关键信息等&#xff09;是你的…

网络通信基本原理

通讯的必要条件 主机之间需要有传输介质。光纤、蓝牙、wify主机上必须有网卡设备。把二进制信息转为高低电压的过程就是数据的调制过程。把电信号转为二进制信息的过程为解调制。主机之间需要协商网络速率。 网路的通讯方式 日常生活中&#xff0c;我们通讯的方式不可能只有…

现代密码学导论-14-基于伪随机发生器的EAV安全

目录 3.3.3 基于伪随机发生器的EAV安全 用伪随机发生器进行加密的图示 CONSTRUCTION 3.17 一种基于伪随机发生器的私钥加密方案 THEOREM 3.16 基于伪随机发生器的私钥加密方案的EAV安全 THEOREM 3.16 的证明 最后来理一下 3.3.3 基于伪随机发生器的EAV安全 用伪随机发生…