【C++关联容器】map的成员函数

news2024/11/26 4:25:52

目录

map

1. 构造、析构和赋值运算符重载

1.1 构造函数

1.2 析构函数

1.3 赋值运算符重载

2. 迭代器

3. 容量

4. 元素访问

5. 修改器

6. 观察者

7. 操作

8. 分配器


map

map是关联容器,它按照特定的顺序存储由关键字值和映射值的组合形成的元素。

在一个map中,关键字值通常用于排序和唯一识别元素,而映射值则存储与此键相关的内容。关键字值和映射值的类型可能不同,在成员类型value_type中被组合在一起,它是一个结合了两者的pair类型:

typedef pair<const Key, T> value_type;

在内部,map中的元素总是按照它的关键字进行排序,遵循一个特定的严格的弱排序标准,由其内部的比较对象(类型为Compare)指示。

map容器通常比unordered_map容器按关键字访问单个元素的速度要慢,但是它们允许根据顺序直接迭代子集。

map中的映射值可以使用括号操作符(operator[])直接通过其相应的关键字来访问。

map通常被实现为二叉搜索树。

使用map类型要包含map头文件;map定义在命名空间std中。

1. 构造、析构和赋值运算符重载

1.1 构造函数

重载函数功能
empty构造空的map类对象
range用迭代器区间[first,last)中的元素构造

copy

构造一个x的拷贝
move移动构造函数
initializer list用初始化列表来构造
#include <iostream>
#include <map>
using namespace std;

int main()
{
	map<char, int> m1;//empty
	for (auto e : m1)
	{
		cout << e.first << " " << e.second << endl;
	}
	//空
	
	//插入
	m1.insert({ 'g', 30 });
	m1.insert(make_pair('a', 10));
	m1.insert(pair<char, int>('f', 50));
	m1['b'];
	m1['d'] = 20;
	for (auto e : m1)
	{
		cout << e.first << " " << e.second << endl;
	}
	//a 10
	//b 0
	//d 20
	//f 50
	//g 30

	map<char, int> m2(++m1.begin(), m1.end());//range
	for (auto e : m2)
	{
		cout << e.first << " " << e.second << endl;
	}
	//b 0
	//d 20
	//f 50
	//g 30

	map<char, int> m3(m2);//copy
	//等价于map<char, int> m3 = m2;
	for (auto e : m3)
	{
		cout << e.first << " " << e.second << endl;
	}
	//b 0
	//d 20
	//f 50
	//g 30

	map<string, string> m4{ {"empty","空"},{"range", "范围"},{"copy", "复制"} };
	//等价于map<string, string> m4 = { {"empty","空"},{"range", "范围"},{"copy", "复制"} };
	for (auto e : m4)
	{
		cout << e.first << " " << e.second << endl;
	}
	//copy 复制
	//empty 空
	//range 范围

	return 0;
}

1.2 析构函数

1.3 赋值运算符重载

2. 迭代器

函数功能

begin

&

end

begin返回一个迭代器,指向map对象的第一个元素

end返回一个迭代器,指向map对象的最后一个元素的下一个位置

rbegin

&

rend

rbegin返回一个反向迭代器,指向map对象的最后一个元素

rend返回一个反向迭代器,指向map对象的第一个元素的上一个位置

cbegin

&

cend

cbegin返回一个const迭代器,指向map对象的第一个元素

cend返回一个const迭代器,指向map对象的最后一个元素的下一个位置

crbegin

&

crend

crbegin返回一个const反向迭代器,指向map对象的最后一个元素

crend返回一个const反向迭代器,指向map对象的第一个元素的上一个位置

begin&end和rbegin&rend返回的迭代器指向:

const_iterator是一个指向const内容的迭代器。迭代器本身可以修改,但是它不能被用来修改它所指向的内容。

begin&end/rbegin&rend和cbegin&cend/crbegin&crend的不同:

  • begin&end/rbegin&rend的返回类型由对象是否是常量来决定。如果不是常量,返回iterator;如果是常量,返回const_iterator。
  • cbegin&cend/crbegin&crend的返回类型是const_iterator,不管对象本身是否是常量。
#include <iostream>
#include <map>
using namespace std;

int main()
{
	map<string, string> m{ {"iterator", "迭代器"},{"begin","开始"},{"end", "结束"} };

	map<string, string>::iterator it = m.begin();
	while (it != m.end())
	{
		cout << it->first << " " << it->second << endl;
		//等价于cout << (*it).first << " " << (*it).second << endl;
		++it;
	}
	//begin 开始
	//end 结束
	//iterator 迭代器

	auto rit = m.rbegin();
	//map<string, string>::reverse_iterator rit = m.rbegin();
	while (rit != m.rend())
	{
		cout << rit->first << " " << rit->second << endl;
		//等价于cout << (*rit).first << " " << (*rit).second << endl;
		++rit;
	}
	//iterator 迭代器
	//end 结束
	//begin 开始

	return 0;
}

3. 容量

函数功能
empty检测set是否为空,是返回true,否则返回false
size

返回set的元素个数

max_size返回set所能容纳的最大元素数
#include <iostream>
#include <map>
using namespace std;

int main()
{
	map<string, string> m{ {"iterator", "迭代器"},{"begin","开始"},{"end", "结束"} };

	if (m.empty())
		cout << "map为空" << endl;
	else
		cout << "map不为空" << endl;
	//map不为空

	cout << m.size() << endl;//3

	cout << m.max_size() << endl;//59652323

	return 0;
}

4. 元素访问

函数功能
operator[]

如果k与某个元素的关键字相匹配,返回对其映射值的引用

如果k与任何元素的关键字不匹配,插入一个关键字为k的新元素,并返回对其映射值的引用

at

返回vector中n位置的元素的引用

有越界检查,如果越界会抛异常

#include <iostream>
#include <map>
using namespace std;

int main()
{
	map<char, int> m;

	m['b'];     //插入一个关键字为'b'的元素,但没有对映射值进行初始化
	m['d'] = 20;//插入一个关键字为'd'的元素,并将映射值初始化为20	
	cout << "m['b'] = " << m['b'] << endl;//m['b'] = 0
	cout << "m['d'] = " << m['d'] << endl;//m['d'] = 20
	

	m['b'] = 50;//修改关键字为'b'的元素的映射值为50
	cout << "m['b'] = " << m['b'] << endl;//m['b'] = 50
	cout << "m['d'] = " << m['d'] << endl;//m['d'] = 20

	return 0;
}

5. 修改器

函数功能
insert插入元素
erase删除元素
swap交换内容
clear清空内容
emplace构建和插入元素
emplace_hint构建和插入带有提示的元素
#include <iostream>
#include <map>
using namespace std;

int main()
{
	map<char, int> m1;

	m1.insert(make_pair('p', 10));
	m1.insert(pair<char, int>('f', 50));
	m1.insert({ 'g', 30 });
	for (auto e : m1)
	{
		cout << e.first << " " << e.second << endl;
	}
	//f 50
	//g 30
	//p 10

	m1.erase(--m1.end());
	m1.erase('g');
	for (auto e : m1)
	{
		cout << e.first << " " << e.second << endl;
	}
	//f 50

	map<char, int> m2{ {'h', 90},{'d',40},{'a',20} };
	m1.swap(m2);
	for (auto e : m1)
	{
		cout << e.first << " " << e.second << endl;
	}
	//a 20
	//d 40
	//h 90

	m1.clear();
	if (m1.empty())
		cout << "m1被清空" << endl;
	else
		cout << "m1没被清空" << endl;
	//m1被清空

	return 0;
}

6. 观察者

函数功能
key_comp返回比较对象
value_comp返回比较对象

7. 操作

函数功能
find获取元素的迭代器
count

计算特定元素的数量

返回值0或1

lower_bound返回指向下限的迭代器
upper_bound返回指向上限的迭代器
equal_range

获取相等元素的范围

范围内有0或1个元素

#include <iostream>
#include <map>
using namespace std;

int main()
{
	map<char, int> m;
	m.insert({ 'g', 30 });
	m.insert(make_pair('a', 10));
	m.insert(pair<char, int>('f', 50));
	m['b'];
	m['d'] = 20;
	
	auto it = m.find('f');
	if (it != m.end())
	{
		cout << "f在map中" << endl;
	}
	else
	{
		cout << "f不在map中" << endl;
	}
	//f在map中

	it = m.find('h');
	if (it != m.end())
	{
		cout << "h在map中" << endl;
	}
	else
	{
		cout << "h不在map中" << endl;
	}
	//h不在map中

	if (m.count('a'))
	{
		cout << "a在map中" << endl;
	}
	else
	{
		cout << "a不在map中" << endl;
	}
	//a在map中

	if (m.count('c'))
	{
		cout << "c在map中" << endl;
	}
	else
	{
		cout << "c不在map中" << endl;
	}
	//c不在map中

	return 0;
}

8. 分配器

函数功能
get_allocator获取分配器

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

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

相关文章

【Java】再看排序 —— 关于 Comparator 的用法

谈一个比较基础&#xff0c;又很常用的东西&#xff0c; Comparator 类&#xff0c;之前我写过一篇浅浅的关于这个的文章 &#xff0c;今天再复盘一下这个问题&#xff0c;把它弄熟 ps: 本文中提供的代码&#xff0c;为了提高可读性都没用 lamdam 和 函数式编程 简化书写&…

JVM-0423

运行时内存 程序计数器 作用:记录每个线程的代码执行到哪一条指令了 为了保证程序(在操作系统中理解为进程)能够连续地执行下去&#xff0c;CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用&#xff0c;所以通常又称为指令计数器。在程序开始执行…

论文阅读:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

使用移位窗口的分层视觉Transformer 继续阅读Transformer相关 0、摘要 本文提出了一种新的视觉Transformer&#xff0c;称为Swin Transformer&#xff0c;能够作为一个通用的骨干计算机视觉。将Transformer从语言适应到视觉的挑战来自于两个领域之间的差异&#xff0c;例如视…

QGIS数据可视化学习笔记01——一般的图层样式调整和在地图上添加图表

说明&#xff1a;QGIS数据可视化章节用的数据为QGIS绘制一张地图学习章节的数据&#xff0c;传送门&#xff1a;https://blog.csdn.net/qq_47188967/article/details/130196284 一、 一般的图层样式调整 首先呢&#xff0c;在QGIS中打开上一章节用的数据&#xff0c;界面如下&…

SpringMVC-HttpMessageConverter的使用

目录 1、HttpMessageConverter概述 2、RequestBody 3、RequestEntity 4、ResponseBody 5、SpringMVC处理json 6、SpringMVC处理ajax 7、RestController注解 8、ResponseEntity 1、HttpMessageConverter概述 HttpMessageConverter是什么 HttpMessageConverter&#xff0…

rabbitmq的高级特性

1.消息可靠性问题&#xff08;实现消费者确认&#xff09; 1.在项目中添加配置 logging:pattern:dateformat: HH:mm:ss:SSSlevel:cn.itcast: debug spring:rabbitmq:host: 192.168.2.182 # rabbitMQ的ip地址port: 5672 # 端口username: rootpassword: rootvirtual-host: /publ…

1.Qt Creator简介及Hello World

安装 下载链接 Qt 5.14.2下载 SDK建议的安装路径 SDK的案例中&#xff0c;宏定义默认要求直接安装在C盘 查看建议路径的流程 右键“解决方案”下的项目名称&#xff0c;选择最下面的“属性” “C/C” -> “常规” -> “附加包含目录” -> “右侧小箭头” ->…

【软件测试】3年测试岗碌碌无为?我到底该咋办?测试提升成长之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 无论哪个岗位&…

线程同步方式之三信号量

Linux线程同步方法之三 信号量 信号量本质上是一个计数器&#xff0c;用来表示公共资源中资源的数量。只要拥有信号量&#xff0c;未来一定能够拥有临界资源的一部分使用权。故申请信号量的本质就是对临界资源中特定的小块资源的预订机制。故能通过访问信号量就能提前知道临界…

Redis可视化工具-Another Redis Desktop Manager 安装与连接哨兵集群

目录 一、下载安装 1.1 下载 1.2 安装 二、使用 2.1 新建连接 2.2 新增数据 2.3 应用设置 2.3.1深色模式、语言 2.3.2多个连接的颜色标记 一、下载安装 Another Redis DeskTop Manager 是 Redis 可视化管理工具&#xff0c;体积小&#xff0c;完全免费。最重要的是稳定…

智慧物联网边缘协同感知(EICS)技术方案: 低功耗无线扫描唤醒技术

物联网的传感器或控制节点通常有体积限制&#xff0c;只能使用钮扣电池、小型电池&#xff0c;甚至使用能量收集源进行运作。在许多工业应用中&#xff0c;需要人工更换电池的成本&#xff0c;特别是在难以接近地方更换所需的成本&#xff0c;使得人们更加重视降低平均电流消耗…

缓存一致问题、幂等、jvm调优

缓存笔记 来自 程序员囧辉 黑马博学谷 幂等问题 1 缓存一致问题 1.1.同步删除 核心流程&#xff1a; 更新数据库数据删除缓存数据 问题&#xff1a; . 并发场景下存在脏数据 (并发有脏数据问题). 难以收拢所有更新数据库入口 (可能通过命令行、工具等删除db&#xff0c;…

[Golang] 设计模式以及单例设计模式实例实现

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

Django框架之视图的基本使用

Django框架之视图的基本使用 概述 在django中&#xff0c;视图方法简称视图&#xff0c;对web请求进行回应。 视图就是一个python函数&#xff0c;在views.py文件中定义。 定义视图 在project/myapp/views.py文件中定义 引入http from django.http import HttpResponse 视…

【C语言】实战练习

目录 1.计算体积&#xff1a; 2、根据父母身高计算孩子的理论身高&#xff1a; 3、三十六计的几计&#xff1a; 4、文本输出&#xff1a; 5、粮仓计数&#xff1a;​编辑 6、auto 7、static: 8、模拟用户注册系统&#xff1a; 1.计算体积&#xff1a; #include <std…

NetXpert XG2帮您解决“布线安装与维护”难题

在传输大量数据时&#xff0c;光纤变得越来越重要&#xff0c;而铜缆在未来也将继续发挥重要作用&#xff0c;因此我们不仅要比较两种类型布线的优缺点&#xff0c;还要探究光纤传输中的错误来源。 测试光缆传输损耗的准确性对于故障排除至关重要&#xff0c;特别是在光纤情况下…

27-Servlet执行原理

目录 1.Tomcat详解 ①接收请求&#xff1a; ②根据请求计算响应&#xff1a; ③返回响应&#xff1a; 2.Tomcat执行流程 2.1.Tomcat 初始化流程 2.2.Tomcat 处理请求流程 2.3.Servlet 的 service 方法的实现 在 Servlet 的代码中并没有写 main ⽅法&#xff0c;那么对应…

2022年中国预制菜市场规模已超过4000亿元,2026年将突破万亿

佛跳墙、小酥肉、酸菜鱼、猪肚鸡、煎牛排、炸鸡、小龙虾等等&#xff0c;这些需要花上长时间烹饪制作的大菜&#xff0c;现在只需用烤箱或空气炸锅几分钟就制作出来了&#xff0c;且味道还不赖。预制菜最大的优势在于方便&#xff0c;极大的省去了买菜洗菜、切菜、制作的繁琐程…

YOLOv5网络模型的结构原理讲解(全)

目录 前言1. 基本概念2. 输入端2.1 Mosaic 图像增强2.2 自适应锚框计算2.3 自适应图片缩放 3. Backbone层3.1 Focus结构3.2 CSP结构 3. Neck网络3.1 SPP结构3.2 PAN结构 4. 输出端4.1 Bounding box损失函数4.2 NMS非极大值抑制 前言 YOLOv5有几种不同的架构&#xff0c;各网络…

ChatGPT评微博热文“留给普通人的最后一扇门,快要关闭了”

目录 留给普通人的最后一扇门&#xff0c;快要关闭了 这篇文章你看过吗 普通人通过接受高等教育提升阶级的路还走得通吗&#xff0c;为什么大家都开始考公务员了 高等教育仍然是提升阶级的一条途径&#xff0c;但并不是唯一的途径。那还有哪些路径&#xff1f; 继续&#x…