C++:map容器的使用

news2024/11/13 9:30:44

一、map的使用介绍

map文档介绍

1.1 map的模版参数

Key:键值对中Key的类型

T:键值对中value的类型

Compare:比较器的类型,map中的元素是按照Key来进行比较的,缺省情况(不传参数时)按照小于来比较,一般情况下(内置类型的元素)不需要传递该参数,对于自定义类型无法进行比较时,需要用户自己显式的进行传递比较规则(这里一般是传入仿函数或者函数指针)

Alloc:通过空间配置器来申请底层空间, 不需要用户传递,但是如果不想使用标准库提供的空间配置器时可以自己传递。

注意:使用map时,需要包含头文件。

1.2 map的构造

  1. 默认构造:构造一个空的map,不需要传参
  2. 使用迭代器区间构造
  3. 拷贝构造

实例:

void test1()
{
	//使用无参构造,构造出一个空map
	map<int, int> m;

	vector<pair<int, int>>tmp = { {1, 2}, {2, 3}, {3, 4}, {4, 5} };
	//使用迭代器区间构造一个map
	map<int, int> m1(tmp.begin(), tmp.end());
	cout << "迭代器区间构造:" << endl;
	for (auto e : m1)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;

	//使用拷贝构造,构造一个map
	map<int, int> m2(m1);
	cout << "拷贝构造:" << endl;
	for (auto e : m2)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
}

运行结果:

1.3 map的迭代器

  1. begin():返回首元素位置的迭代器
  2. end(): 返回最后一个元素的下一个位置的迭代器
  3. cbegin(): 返回首元素位置的const迭代器(也就是不能对元素进行修改的迭代器)
  4. cend(): 返回最后一个元素的下一个位置的const迭代器
  5. rbegin(): 反向迭代器,返回最后一个元素的下一个位置的反向迭代器相当于end(),++反向迭代器会向前遍历
  6. rend(): 反向迭代器,返回首元素位置的反向迭代器,相当于begin(), --反向迭代器会向后遍历
  7. crbegin(): 反向const迭代器,返回最后一个元素的下一个位置的反向const迭代器相当于cend(),++反向迭代器会向前遍历
  8. crend(): 反向迭代器,返回首元素位置的反向const迭代器,相当于cbegin(), --反向迭代器会向后遍历

注意:使用const迭代器时不能对指向的元素进行修改,否则编译器会进行报错,如下所示:

实例:

void test2()
{
	std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };
	std::map<int, int>::iterator it1 = m1.begin();
	cout << "正向迭代器: " << endl;
	while (it1 != m1.end())
	{
		cout << it1->first << ":" << it1->second << endl;
		++it1;
	}
	cout << endl;
	std::map<int, int>::const_iterator it2 = m1.cbegin();
	cout << "正向const迭代器: " << endl;//const迭代器不能对指向元素进行修改,进行修改会报错
	while (it2 != m1.cend())
	{
		cout << it2->first << ":" << it2->second << endl;
		++it2;
	}
	cout << endl;

	std::map<int, int>::reverse_iterator it3 = m1.rbegin();
	cout << "反向迭代器: " << endl;
	while (it3 != m1.rend())
	{
		cout << it3->first << ":" << it3->second << endl;
		++it3;
	}
	cout << endl;
}

运行结果:

1.4 map的容量和元素访问

容量:

empty:如果map容器内是空的话就返回true否则返回false

size:返回map中的有效元素个数

元素访问:

operator[] :根据key去查找value,如果没有对应的key就进行插入

实例:

void test3()
{
	std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };
	//容量
	if (!m1.empty())
		cout << "map不为空" << endl;
	else
		cout << "map为空" << endl;

	cout << "map内的有效元素个数:" << m1.size() << endl;

	//元素访问
	cout << "m1[1] == " << m1[1]  << "  " << "m1[2] == " << m1[2] << endl;
	//使用operator[]时如果没有对应的key则会进行插入, 插入后value默认给0
	cout << "m1[100] == " << m1[100] << endl;
}

运行结果:

1.5 map的元素修改

  1. 使用一个键值对进行插入,val是一个键值对,返回值是一个pair类型,iterator是插入位置的迭代器,bool返回的是是否插入成功,插入成功放回true,否则返回false
  2. 插入一个键值对val, 插入 val 到尽可能接近正好在 pos 之前的位置。
  3. 插入来自范围 [first, last) 的元素。优先插入键值与map中元素不重叠的元素,如果范围中的多个元素的键比较相等,标准库里没有确定插入规则。

实例:

void test4()
{
	std::map<int, int> m1;
	//插入一个键值对
	m1.insert(make_pair(1, 2));
	for (auto e : m1)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
	//在尽可能接近pos插入一个键值对
	m1.insert(m1.begin(), make_pair(2, 5));
	for (auto e : m1)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;

	//使用迭代器范围插入
	vector<pair<int, int>> tmp = { {1, 3}, {4, 2} };
	m1.insert(tmp.begin(), tmp.end());
	for (auto e : m1)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
}

运行结果:

  1. 按迭代器pos位置进行删除
  2. 按key进行删除
  3. 按迭代器区间进行删除

实例:

void test5()
{
	std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };
	for (auto e : m1)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
	//按pos位置进行删除
	auto it = m1.find(1);
	m1.erase(it);
	for (auto e : m1)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
	//按key删除
	m1.erase(2);
	for (auto e : m1)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
	//按迭代器区间进行删除
	m1.erase(m1.begin(), m1.end());

	if (m1.empty())
		cout << "m1已经为空" << endl;

}

运行结果:

  1. 通过key进行查找返回普通迭代器,可以通过返回的迭代器对元素进行修改
  2. 通过key进行查找返回const迭代器,不能通过返回的迭代器读元素进行修改

实例:

void test6()
{
	std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };
	auto pos = m1.find(1);
	cout << pos->first << ":" << pos->second << endl;

	auto pos1 = m1.find(8);
	cout << pos1->first << ":" << pos->second << endl;
}

运行结果:

交换两个swap容器里面的元素。

实例:

void test7()
{
	std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };
	std::map<int, int> m2;//空map
	//交换前:
	cout << "交换前:" << endl;
	if (!m1.empty())
	{
		cout << "m1:" << endl;
		for (auto e : m1)
		{
			cout << e.first << ":" << e.second << endl;
		}
	}
	else
	{
		cout << "m1为空" << endl;
	}

	if (!m2.empty())
	{
		cout << "m2:" << endl;
		for (auto e : m2)
		{
			cout << e.first << ":" << e.second << endl;
		}
	}
	else
	{
		cout << "m2为空" << endl;
	}
	cout << endl;
	//交换后:
	cout << "交换后:" << endl;
	m2.swap(m1);
	if (!m1.empty())
	{
		cout << "m1:" << endl;
		for (auto e : m1)
		{
			cout << e.first << ":" << e.second << endl;
		}
	}
	else
	{
		cout << "m1为空" << endl;
	}

	if (!m2.empty())
	{
		cout << "m2:" << endl;
		for (auto e : m2)
		{
			cout << e.first << ":" << e.second << endl;
		}
	}
	else
	{
		cout << "m2为空" << endl;
	}
	cout << endl;
}

运行结果:

clear:将一个map里的元素清空。

实例:

void test8()
{
	std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };
	if (!m1.empty())
		cout << "m1的有效数据个数:" << m1.size() << endl;
	else
		cout << "m1为空" << endl;
	//清空m1
	m1.clear();
	if (!m1.empty())
		cout << "m1的有效数据个数:" << m1.size() << endl;
	else
		cout << "m1为空" << endl;
}

运行结果:

count返回key在map中出现的次数,但是map中key值是不允许重复的,因此返回值不是0,就是1。

可以利用这个特性来判断key是否在map中。

实例:

void test9()
{
	std::map<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10} };
	int x = 0;
	cin >> x;
	if (m1.count(x))
		cout << "key为" << x << "的元素已经存在" << endl;
	else
		cout << "key为" << x << "的元素不存在" << endl;
}

运行结果:

二、map总结

  1. map中的元素是键值对
  2. map中的key是唯一的,并且key是不能进行修改的
  3. 默认按照小于的方式对key进行排序。
  4. map中的元素通过迭代器去遍历,可以得到一个有序序列(map的底层是红黑树,迭代器走的是中序遍历,因此遍历得到的序列是有序的)。
  5. map的底层是红黑树,查找效率是O(logN)
  6. map支持[]操作符,重载了operator[]因此可以通过[]对val进行访问。

三、multimap

3.1 multimap的介绍

multimap文档介绍

multimap和map只有一点不同,map的key是唯一的,multimap的key是可以重复的

multimap的其他方面基本与map相同,使用时需要包含头文件。

注意:multimap中没有重载operator[]运算符,因为key不是唯一的不能通过key来对val进行访问。

3.2 multimap的使用

实例:

void test_multimap()
{
	std::multimap<int, int> m1{ {1, 2}, {2, 4}, {2, 5}, {3, 6}, {7, 9}, {8, 10}, {1, 3}, { 2, 6 }, {3, 7} };
	for (auto e : m1)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
}

运行结果:

四、 multimap总结

multimap的接口可以参考map的接口,功能基本相同。

  1. multimap中的key是可重复的。
  2. multimap中的元素默认按照小于比较。
  3. multimap中没有重载operator[]运算符。
  4. multimap使用时包含头文件。

这篇文章到这里就结束了,主要介绍了map的接口使用以及map和multimap的区别,希望大家通过这篇文章,能够对map的使用有所了解。

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

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

相关文章

健康读物:浮毛带来的危害竟这么大?去浮毛宠物空气净化器分享

前两天去我朋友家玩&#xff0c;进他家扑面而来的浮毛让我觉得呼吸都困难了不少&#xff0c;朋友说也有打扫&#xff0c;空气中的浮毛是真没辙&#xff0c;而且他觉得浮毛那么大又进不了肺部&#xff0c;对健康没啥危害&#xff0c;顶多吃几口猫毛&#xff0c;就没有处理。于是…

2024年7月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2024年7月国产数据库大事件和重要产品发布消息。 目录 2024年7月国产数据库大事记 TOP102024年7月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证代表厂商大事记排行榜新增数据库厂商活动相关资料 2024年7月国产数据库大事记 …

操作系统(七)深入理解Linux内核进程上下文切换

本文深入探讨了Linux内核中的进程上下文切换机制。作者韩传华首先解释了进程上下文的概念&#xff0c;包括虚拟地址空间和硬件上下文&#xff0c;并以Linux 5.0内核源码和ARM64架构为例进行讲解。文章详细介绍了进程上下文切换的两个主要过程&#xff1a;进程地址空间切换和处理…

PHP餐饮点餐系统小程序源码

&#x1f37d;️餐饮新纪元&#xff1a;揭秘高效点餐系统的魅力✨ &#x1f4f1;一键下单&#xff0c;快捷就餐新体验&#x1f680; 在这个快节奏的时代&#xff0c;谁不渴望在忙碌之余享受一顿快速而美味的餐食呢&#xff1f;餐饮点餐系统的出现&#xff0c;就像是为我们的餐…

Spring Boot实战:拦截器

一.拦截器快速入门 1.1了解拦截器 什么是拦截器&#xff1a; 概念 &#xff1a;拦截器是Spring框架提供的核⼼功能之⼀, 主要⽤来拦截⽤⼾的请求, 在指定⽅法前后, 根据业务需要执⾏预先设定的代码。 也就是说, 允许开发⼈员提前预定义⼀些逻辑, 在⽤⼾的请求响应前后执⾏. 也…

CoA:提升大型语言模型的多步推理能力

人工智能咨询培训老师叶梓 转载标明出处 大模型&#xff08;LLMs&#xff09;在处理复杂问题时&#xff0c;往往需要借助外部工具来获取现实世界知识&#xff0c;例如网络搜索、数学和物理规则等。然而现有的工具辅助语言模型在多步推理问题中调用工具时存在效率和准确性的挑战…

企业级敏捷框架:业务驱动型敏捷与产品需求团队

本文介绍了一种新的企业级敏捷框架——业务驱动型敏捷&#xff08;Business-driven Agile&#xff09;与 PRT&#xff08;Product Requirement Team&#xff09;&#xff0c;旨在解决传统敏捷方法中需求定义的瓶颈&#xff0c;从而提升产品价值并提高开发效率。原文: A new ent…

dynamic-datasource+Mybatis多数据源使用

Gitee地址:dynamic-datasource: 基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency&…

腾讯云AI代码助手:智驭Python,编织代码的诗篇 —— 深度测评体验

文章目录 引言&#x1f496;1. 开发环境介绍&#x1f4bb;vscode安装插件方法一&#xff1a;链接访问下载安装方法二&#xff1a;vscode直接安装 2. 使用实例✨1. &#x1f6e1;️代码补全&#xff0c;分秒必争2. &#x1f4a1; 技术对话&#xff0c;智慧碰撞3. &#x1f527; …

【分享】洁净室环境检测必测项目详细解读

环境监测&#xff08;Environmental monitoring&#xff09;在实现此目标中起着重要的作用——它提供了有关制造环境的关键信息&#xff0c;避免放行可能受污染的产品。 由于环境监测在制造过程中的重要性&#xff0c;相关机构围绕市场活动推出了许多法规要求和指南。这些标准随…

el-table自动滚动到最底部

我的需求是这样的&#xff0c;因为我的表格是动态的&#xff0c;可以手动新增行&#xff0c;固定表头&#xff0c;而且需要一屏显示&#xff0c;为了方便用户就需要再新增的时候表格自动向上滚动。 差了官方文档后发现有一个属性可以支持 这个属性正是自己需要的&#xff0c;所…

朵拉朵尚:坚持深耕护肤领域 荣获2023年度影响力品牌奖

朵拉朵尚&#xff1a;坚持深耕护肤领域 荣获2023年度影响力品牌奖 伴随着经济全球化的浪潮&#xff0c;新产业、新业态、新动能不断涌现&#xff0c;我国化妆品消费也迅速崛起&#xff0c;成为近年来化妆品行业发展增长速度最快的国家。1月30日&#xff0c;朵拉朵尚受邀参加快…

使用 Plotly 创建专业可视化时你应该知道的七个关键功能

欢迎来到雲闪世界。我们习惯于在在线报纸上看到交互式可视化&#xff0c;并且我们经常想知道数据记者使用什么工具来创建这些看起来专业的可视化。事实是&#xff0c;创建这种类型的可视化不需要任何特殊软件&#xff1b;Python 中的大多数交互式可视化库都是高度可定制的&…

Stable Diffusion史诗级更新! WebUI 1.10.0时代来了!

前言 大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 前几天 AUTOMATIC1111 发布了Stable Diffusion WebUI 1.10&#xff0c;我也在第一时间将云环境的镜像升级到了最新版本&#xff0c;有兴趣的同学可以去体验下&#xff0c;目前已经发布到了AutoDL&#xff0c;…

博客趣二维码生成器网站源码

这款二维码生成源码可以把电子名片、文本、wifi网络、电子邮件、短信、电话号码、网址等信息生成对应的二维码图片。地图位置二维码生成使用是谷歌地图的api地址&#xff0c;懂程序的可以改成国内地图http://www.bokequ.com/588.html

CST软件如何添加和管理自定义的材料?

经常有用户想手动添加材料到CST软件的材料库&#xff0c;或让CST软件指向自定义的材料库&#xff0c;由于CST软件没有自动追踪用户材料数据的功能&#xff0c;这里就需要用户知道一些小技巧&#xff0c;不然看不到这些材料哦 1. 材料库的路径&#xff1a; 首先解释材料库…

Django中事务的基本使用

1. Django事务处理 事务(Transaction): 是一种将多个数据库操作组合成一个单一工作单元的机制. 如果事务中的所有操作都成功完成, 则这些更改将永久保存到数据库中. 如果事务中的某个操作失败, 则整个事务将回滚到事务开始前的状态, 所有的更改都不会被保存到数据库中. 这对于…

流媒体服务器XMedia插件服务安装使用

XMedia是AMS流媒体服务器的一个插件服务&#xff0c;可以扩展支持 FLV 、GB28181上传、WEBRTC、SRT协议上传&#xff0c;增强了服务器的功能 一、服务插件安装 资源下载 XMedia-CentOS7-x86-64-20240710-212007 把安装包放入LINUX服务器&#xff0c;执行如下命令,如果未安装u…

因子分析和非负矩阵分解

因子分析 (Factor Analysis, FA) 因子分析是一种统计方法&#xff0c;用于通过少量潜在变量&#xff08;因子&#xff09;解释观测数据中的相关结构。它在数据降维、特征提取和变量选择中广泛应用。 原理 因子分析假设观测变量是由少数潜在因子线性组合并加上噪声得到的。通…

Stable Diffusion 使用详解(6)---人物风格及背景变换

目录 背景 ControlNet lineart IP-Adapter 实例 生成场景模特 操作 生成效果 生成背景 操作 生成效果 融合 ip-adaptor contrlNet lineart controlNet 生成效果 背景 很多场景下&#xff0c;需要完成人物风格变换&#xff0c;比如现在是写真集&#xff0c;想转…