map容器的基本使用

news2024/11/25 1:31:00

文章目录

  • map
  • map模板参数
  • 默认构造
  • 迭代器
  • [ ]
  • { }
  • insert
  • erase
  • find
  • lower_bound && upper_bound
  • count
  • equal_range

map和set容器,multimap和multiset是树形结构的关联式容器,这四种容器底层原理都是红黑树,容器中的元素是一个有序序列。

map

1.map是关联式容器,它是按照特定的次序(按照key来比较),存储由键key和值value组成的键值对
2.在map中,键值key通常用于排序和唯一的标识元素,而value中存储与此键值key关联的内容。键值key和value的类型可能不同,并且在map内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:
typedef pair<const key, T> value_type;
3.在内部,map中的元素总是按照键值key进行比较排序的
4.map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

map模板参数

在这里插入图片描述
Compare:仿函数,缺省参数为less,默认是以升序(对于string是字典序)排序的,我们可以给该类型传递参数greater,将容器中的顺序改为降序。如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)

默认构造

在这里插入图片描述
1.空的map
2.使用区间来初始化
3.拷贝构造
4.移动语义
5.可变参数列表初始化

map<string, string> m1;//空容器

vector<pair<string, string>> v{ {"hello", "你好"}, {"sort", "排序" }};
/*cout << (*v.begin()).first << endl;
cout << (*v.begin()).second << endl;*/
map<string, string> m2(v.begin(), v.end());//区间初始化
map<string, string> m3(m2);

map<string, string> m4{ { "hello", "你好" }, { "sort", "排序" } };//可变参数列表初始化

迭代器

在这里插入图片描述
begin:返回容器的第一个元素位置
end:返回容器最后一个元素的下一个位置
rbegin:返回最后一个元素位置------底层其实是返回的end() - 1
rend:返回第一个元素的前一个位置------底层其实是返回的begin()-1
c:返回的是const迭代器,元素不可以被修改
迭代器具体实现请阅读C++迭代器底层实现

[ ]

map允许根据key值直接访问对应的value
在这里插入图片描述
在这里插入图片描述

int main()
{
	map<string, string> dict;
	dict.insert(make_pair("string", "字符串"));
	dict.insert(make_pair("sort", "排序"));
	dict.insert(make_pair("insert", "插入"));
	dict["string"];		//查找和读
	dict["map"];		//插入
	dict["map"] = "地图,映射";//修改
	dict["set"] = "集合";//插入 + 修改
	return 0;
}

在这里插入图片描述
map容器[]的底层是通过insert来实现的
底层

V& operator[](const K& key)
{
	pair<iterator, bool> ret = insert(make_pair(key, V()));
	return ret.first->second;
}

在使用[],当map中不存在对应的key时,会将该key值插入到map中,value此时传的是value对应类型的匿名对象
operator[]的返回值value

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" } };
string ret = m1["sort"];//根据[]直接访问元素
cout << ret << endl;
m1["hello"] = "你好!";//修改key值对应的value
cout << m1["hello"] << endl;

map允许通过key对应的修改value

int main()
{
	map<string, string> dict;
	dict.insert(make_pair("string", "字符串"));
	dict.insert(make_pair("sort", "排序"));
	dict.insert(make_pair("insert", "插入"));
	dict["string"];		//查找和读
	dict["map"];		//插入
	dict["map"] = "地图,映射";//修改
	dict["set"] = "集合";//插入 + 修改
	return 0;
}

{ }

map<string, string> m;
m.insert({"insert", "插入"});

C++11支持{ },多参数的构造函数隐式类型转换,在底层会将{}转化为make_pair

insert

在这里插入图片描述
map的插入,插入的是键值对
在这里插入图片描述
1.插入一个键值对
3.插入一个区间
4.插入一个可变参数列表

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" } };
m1.insert(make_pair("David", "戴维"));
for (auto& e : m1)
{
	cout << e.first << ": " << e.second << endl;
}
return 0;

在这里插入图片描述

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" } };
m1.insert(make_pair("David", "戴维"));//插入单个键值对
for (auto& e : m1)
{
	cout << e.first << ": " << e.second << endl;
}
map<string, string> m2;
m2.insert(m1.begin(), m1.end());//插入一个区间
for (auto& e : m2)
{
	cout << e.first << ": " << e.second << endl;
}
for (auto& e : m2)
{
	cout << e.first << ": " << e.second << endl;
}
map<string, string> m3;
m3.insert({ { "hello", "你好" }, { "sort", "排序" } });//插入一个可变参数列表
for (auto& e : m3)
{
	cout << e.first << ": " << e.second << endl;
}

erase

在这里插入图片描述

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" }, {"David", "戴维"}, {"leave", "离开"} };

for (auto& e : m1)
{
	cout << e.first << ": " << e.second << endl;
}

map<string, string>::iterator it = m1.begin();
m1.erase(it);//根据迭代器的指向删除对应的键值对
m1.erase("leave");//根据key删除键值对
cout << endl;
for (auto& e : m1)
{
	cout << e.first << ": " << e.second << endl;
}
it = m1.begin();
m1.erase(++it, m1.end());//删除某一个区间
cout << endl;
for (auto& e : m1)
{
	cout << e.first << ": " << e.second << endl;
}

find

在这里插入图片描述
find返回值为指向该键值对的迭代器指针

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" }, {"David", "戴维"}, {"leave", "离开"} };
map<string, string>::iterator it = m1.find("sort");//通过key找到对应的键值对
cout << (*it).first << ": " << (*it).second << endl;
if (it != m1.end())
{
	m1.erase(it);
}

lower_bound && upper_bound

下界
在这里插入图片描述
上界:在这里插入图片描述

map<string, string> m1{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" }  };
map<string, string>::iterator lower_it1 = m1.lower_bound("hello");
map<string, string>::iterator lower_it2 = m1.lower_bound("i");
cout << (*lower_it1).first << " " << (*lower_it1).second << endl;//hello : 你好
cout << (*lower_it2).first << " " << (*lower_it2).second << endl;//leave : 离开
cout << endl;
map<string, string>::iterator upper_it1 = m1.upper_bound("hello");
map<string, string>::iterator upper_it2 = m1.upper_bound("i");
cout << (*upper_it1).first << " " << (*upper_it1).second << endl;//leave : 离开
cout << (*upper_it2).first << " " << (*upper_it2).second << endl;//leave : 离开

map中的数据默认是以字典序进行排序的

map<string, string> m1{ { "hello", "你好" }, { "sort", "排序" }, {"David", "戴维"}, {"leave", "离开"} };
map<string, string, greater<string>> m2{ { "hello", "你好" }, { "sort", "排序" }, {"David", "戴维"}, {"leave", "离开"} };

for (auto& e : m1)
{
	cout << e.first << ": " << e.second << endl;
}

cout << endl;
for (auto& e : m2)
{
	cout << e.first << ": " << e.second << endl;
}

在这里插入图片描述

count

在这里插入图片描述
根据key统计它在容器中出现的次数,主要用于multimap中,因为map中不允许出现相同key的数据,对于multimap允许出现同key的数据,即使value也是相同的

map<string, string> m1{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" },{"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" } };

multimap<string, string> m2{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" },{"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" } };
cout << m1.count("David") << endl;//1
cout << m2.count("David") << endl;//2
m2.insert({ "David", "阿伟" });
cout << m2.count("David") << endl;//3

equal_range

在这里插入图片描述
在这里插入图片描述
用于返回一个多个相同key在容器中的区间,这个函数也是主要用于multimap中,对于map某一个key在这个容器中最多只会出现一次因此用处不大
返回值是一个pair对象,first指向该key值在容器中第一次出现的位置指向的仍是一个pair对象,second指向该key值在容器中最后一次出现位置的下一个位置,如果没有该key值,则返回的是一个不存在的区间
下面的it1.first在这里指向的仍是一个pair对象

map<string, string> m1{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" }};

multimap<string, string> m2{ {"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" },
{"David", "戴维"}, { "hello", "你好" }, {"leave", "离开"}, { "sort", "排序" }, {"David", "戴维"}};

pair<map<string, string>::iterator, map<string, string>::iterator> it1 =  m1.equal_range("David");
pair<multimap<string, string>::iterator, multimap<string, string>::iterator> it2 = m2.equal_range("David");
cout << it1.first->first << " " << it1.second->first << endl;
//等价于(*it1.first).second
cout << it2.first->first << " " << it2.second->first << endl;

m2.erase(it2.first, it2.second);

for (auto& e : m2)
{
	cout << e.first << ": " << e.second << endl;
}

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

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

相关文章

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

存储卡显示0字节怎么办?恢复0字节的存储小技巧

存储卡显示0字节是一个常见的故障现象&#xff0c;可能由多种原因引起。本文将详细分析存储卡出现此类问题的各种原因&#xff0c;并提供针对性的解决方法。通过深入了解这些原因和解决方案&#xff0c;读者可以有效地应对存储卡显示0字节的故障&#xff0c;从而恢复存储卡的正…

博主自制PDF转换工具丨支持PDF转图片丨PDF转word丨PDF转Excel丨PDF文本识别丨免费使用在线下载

博主自制PDF转换工具丨支持PDF转图片丨PDF转word丨PDF转Excel丨PDF文本识别丨免费使用在线下载 点我立即下载

CSB文件上传漏洞 -->Day4(图片挂马)

22二号&#xff0c;冬至啦&#xff0c;深圳这边只有5&#xff08;尊嘟好冷啊&#xff09;&#xff0c;写这篇文章的时候都已经是凌晨一点了&#xff0c;相信大部分的人都在温暖的被窝里面了吧&#xff01;&#xff01;&#xff08;可怜的我&#xff0c;还得写writeup&#xff0…

【XML】TinyXML 详解(一):介绍

【C】郭老二博文之&#xff1a;C目录 1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&a…

UG凸起命令

凸起命令是拉伸命令的补充&#xff0c;可以方便的对曲面进行拉伸切除。 当端盖中几何体类型选择默认的截面平面的时候&#xff0c;相当于拉伸命令 当端盖中几何体类型选择凸起的面的时候&#xff0c;相当于拉伸其实曲线变为选择曲线在凸起面的投影曲线&#xff0c;然后基于凸起…

栈的常见题型

1.有效的括号 char pairs(char a) {if(a})return {;if(a])return [;if(a))return (;return 0; } bool isValid(char* s) {char* stack(char*)malloc(sizeof(char)*10000);int top0;int lenstrlen(s);if(len%21)return false;for(int i0;s[i];i){char chpairs(s[i]);if(ch){if(t…

BTF:实践指南

本文地址&#xff1a;BTF&#xff1a;实践指南 | 深入浅出 eBPF 1. BPF 的常见限制 1.1 调试限制1.2 可移植性2. BTF 是什么&#xff1f;3. BTF 快速入门 3.1 BPF 快速入门3.1 BTF 和 CO-RE4. 结论 BPF 是 Linux 内核中基于寄存器的虚拟机&#xff0c;可安全、高效和事件驱动…

【STM32】STM32学习笔记-TIM定时中断(13)

00. 目录 文章目录 00. 目录01. TIM简介02. 定时器类型03. 基本定时器04. 通用定时器05. 高级定时器06. 定时中断基本结构07. 预分频器时序08. 计数器时序09. 计数器无预装时序10. 计数器有预装时序11. RCC时钟树12. 附录 01. TIM简介 TIM&#xff08;Timer&#xff09;定时器…

数据库中间件介绍

文章目录 什么是数据库中间件&#xff1f;Smart-client 模式优点缺点 Proxy 模式优点缺点 单元化架构优点缺点 总结 数据库中间件是连接数据库和应用程序之间的软件层&#xff0c;用于简化数据库管理、提高性能和可伸缩性&#xff0c;同时提供额外的功能和服务。在分布式系统和…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…

Python教程(17)——python模块是什么?python模块详解

Python模块简介 模块是一个包含了Python定义和语句的文件&#xff0c;可用于将功能组织成可重用和可维护的代码块。每个Python文件都可以作为一个模块&#xff0c;模块可以包含变量、函数、类或可执行代码。通过使用模块&#xff0c;我们可以将代码分离成逻辑单元&#xff0c;…

【vtkWidgetRepresentation】第十八期 vtkHoverWidget

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkHoverWidget,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. vtkHoverWidget vtkHoverWidget用于在呈现窗口中…

Python生成圣诞节贺卡-代码案例剖析【第18篇—python圣诞节系列】

文章目录 ❄️Python制作圣诞节贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析 ❄️Python制作圣诞树贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析&#x1f338;总结 &#x1f385;圣诞节快乐&#xff01; ❄️Python制作圣诞节贺卡 …

商户如何去申请支付宝小程序以及对接团购(天财商龙)

申请支付宝小程序的前提&#xff1a;必须要是支付宝实名认证用户&#xff08;要申请企业支付宝&#xff09; 1.申请企业支付宝 申请网址&#xff1a;支付宝商家后台 https://b.alipay.com 企业支付宝必须是法人扫码进行注册 申请资料&#xff1a;企业的营业执照&#xff0c;没…

simulink代码生成(二)——ADC采样模块

这一节梳理如何使用C2000库中的ADC模块&#xff0c;从而实现采样&#xff1b; 先预留几个问题&#xff0c;逐步进行解决。 &#xff08;1&#xff09;在simulink中C2000的ADC采样模块设置是怎么样的&#xff1f;各个选项卡代表什么&#xff1f; &#xff08;2&#xff09;AD…

【开源】基于JAVA语言的学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

谷粒商城|仓储服务-仓库管理

配置服务中心 cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: guliware在网关配置路由转发 guligateway .yml配置文件 - id: ware_routeuri: lb://guliwarepredicates:- Path/api/guliware/**filters:- RewritePath/api/(?<segment>.*),/$\{segm…

计算机网络复习-OSI TCP/IP 物理层

我膨胀了&#xff0c;挂我啊~ 作者简介&#xff1a; 每年都吐槽吉师网安奇怪的课程安排、全校正经学网络安全不超20人情景以及割韭菜企业合作的FW&#xff0c;今年是第一年。。 TCP/IP模型 先做两道题&#xff1a; TCP/IP协议模型由高层到低层分为哪几层&#xff1a; 这题…

EasyPoi(excel导入导出)

一&#xff0c;依赖包&#xff1a; <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.1.3</version></dependency> 二&#xff0c;官网文档 1. 前言 - Powered…