c++set和map

目录

一、set的使用

1、set对象的创建

2、multiset

二、map的使用

1、map对象的创建

2、map的operator[]


序列式容器:vector、list、deque....单纯的存储数据,数据和数据之间没有关联
关联式容器:map、set.....不仅仅是存储数据,一般还可以查找数据,数据之间有强关联


一、set的使用

set是key模型
底层结构是红黑树

1、set对象的创建

	set<int> s;
	s.insert(1);
	s.insert(1);
	s.insert(99);
	s.insert(29);
	s.insert(290);

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

set - C++ Reference (cplusplus.com)这实在没什么讲的,直接看文档吧。
lower_bound >=
uper_bound < #返回下一个值
因为删除是左闭右开,迭代器规定必须是左闭右开

做题找交集:(可以做查重)
思路一:从头开始遍历,双指针,相等都++,不相等,小的++
思路二:两个都交给set,然后其中一个到另外一个内部遍历,结束位置,找到了就插入新的vector

找差集:(同步数据,数据备份,数据修改更新)
思路一:从头开始遍历,双指针,相等都++,不相等,小的就是差集(因为已经不相等了),小的++

2、multiset

multiset - C++ Reference (cplusplus.com)

multi多样的
允许冗余,不去重
在multiset中,相等值可以在左边,也可以在右边,看具体实现逻辑
数据冗余,find的是中序的第一个
为什么是找到中序的第一个?
因为对搜索树来说,中序返回序列就是排序
返回第一个中序的位置,就可以对相同数据进行访问


二、map的使用

map是一个k-val模型(关联式容器)

1、map对象的创建

map<const Key,Value>
创建对象:用pair<key,value>创建对象
map的每一个节点,都是一个pair

map - C++ Reference (cplusplus.com)#文档

multimap - C++ Reference (cplusplus.com)


	//创建以及插入方式一(普通对象)
	map<string, string> dict;
	pair<string, string> k_val1 = { "A","a" };
	dict.insert(k_val1);

	//创建以及插入方式二(innither_list)
	dict = { { "B","b"}, {"C","c"}, {"D","d"} };

	//创建以及插入方式三(匿名对象)
	dict.insert(pair<string, string> {"F", "f"});

	//创建以及插入方式三(隐式类型转换)

	dict.insert({"I", "i"});


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

单参数构造函数支持隐式类型转换
单参数构造函数也支持隐式类型转换,使用{}花括号实现
这里的是转化为pair对象
因为pair内有多参数构造函数
临时变量具有常性
隐式类型转换中间会产生一个临时变量


pair不支持流插入
需要key和value分别打印
第一个叫first,第二个叫second

范围for最好把引用用上,因为是iterator指针深拷贝给auto,代价太大
同时,如果不修改,就使用const

key不能修改,但是second可以
因为搜索树是根据key构成搜索树的

list的迭代器内部封装一个node指针
map和set也是封装一个树节点指针

2、map的operator[]

下标访问的值是key
不管key在不在,返回的都是key所在节点的迭代器的value的引用
即,返回value的引用
两种可能:
一种是key原来就有,插入失败,返回原来key的节点指针
一种是key原来没有,插入成功,返回当前新插入的节点指针

底层是:
 pair<itertor,bool> ret = insert(make_pair(key,v()))
return (ret.first)->second;#返回值的pair的第一个值是key位置的迭代器,第二个位置是是否插入成功判断

所以,
1、【】可以是插入的功能,此时value相当于一个缺省值
2、也可以是插入+修改:dict[key] = new_value(因为返回的是value的引用)
3、还可以查找,返回值的pair的secondhi一个bool值,原来的key存在返回true
如果已经存在,不会插入,返回的是当前key节点的value的引用
4、也可以修改(已知存在的情况下用,否则就会插入)
5、对value进行统计
怎么做到的?主要是pair的value构造是一个缺省值,返回值是value的引用,可以直接进行修改++

一下是一个简单的实例:

void test_map1()
{
	map<string, int> m;
	
	m["A"];//插入
	m["B"]++;//修改value+1
	m["C"];//
	m["D"];
	

	//auto打印
	for (auto& e : m) 
	{
		cout << e.first << ":" << e.second << endl;
	}

	//迭代器打印
	//map<string, int>::iterator it = m.begin();
	//while (it !=  m.end())
	//{
	//	cout << it->first << ":" << it->second << endl;
	//	//cout << it.operator->()->first << ":" << it.operator->()->second << endl;
	//	++it;
	//}

	//查找
	if (m["D"])
	{
		cout << "D存在" << endl;
	}
	else
	{
		cout << "D不存在" << endl;
	}

	if (m["W"])
	{
		cout << "W存在" << endl;
	}
	else
	{
		cout << "W不存在" << endl;
	}
}

count返回个数
mutilmap允许冗余

稳定排序:stable_sort(归并实现

稳定的排序:插入,归并,冒泡(冒泡为数不多的牌面)


 

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

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

相关文章

2000-2020年县域创业活跃度数据

2000-2020年县域创业活跃度数据 1、时间&#xff1a;2000-2020年 2、指标&#xff1a;地区名称、年份、行政区划代码、经度、纬度、所属城市、所属省份、年末总人口万人、户籍人口数万人、当年企业注册数目、县域创业活跃度1、县域创业活跃度2、县域创业活跃3 3、来源&#…

python数据可视化:显示两个变量间的关系散点图scatterplot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 显示两个变量间的关系 散点图 scatterplot() [太阳]选择题 请问关于以下代码表述错误的选项是&#xff1f; import seaborn as sns import matplotlib.pyplot …

VISO流程图之子流程的使用

子流程的作用 整个流程图的框图多而且大&#xff0c;进行分块&#xff1b;让流程图简洁对于重复使用的流程&#xff0c;可以归结为一个子流程图&#xff0c;方便使用&#xff0c;避免大量的重复性工作&#xff1b; 新建子流程 方法1&#xff1a; 随便布局 框选3 和4 &#…

SQL:NOT IN与NOT EXISTS不等价

在对SQL语句进行性能优化时&#xff0c;经常用到一个技巧是将IN改写成EXISTS&#xff0c;这是等价改写&#xff0c;并没有什么问题。问题在于&#xff0c;将NOT IN改写成NOT EXISTS时&#xff0c;结果未必一样。 目录 一、举例验证二、三值逻辑简述三、附录&#xff1a;用到的S…

3.3Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用-Vue组合式API

为什么要使用Composition API 一个Options API实例 在前面的课程中&#xff0c;我们都是采用 Options API&#xff08;基于选项的 API &#xff09; 来写一个组件的。下面是一个实例&#xff1a; <template> Count is: {{ count }}, doubleCount is: {{ doubleCount…

深入理解网络原理3----TCP核心特性介绍(上)【面试高频考点】

文章目录 前言TCP协议段格式一、确认应答【保证可靠性传输的机制】二、超时重传【保证可靠性传输的机制】三、连接管理机制【保证可靠性传输的机制】3.1建立连接&#xff08;TCP三次握手&#xff09;---经典面试题3.2断开连接&#xff08;四次挥手&#xff09;3.3TCP状态转换 四…

【skill】onedrive的烦人问题

Onedrive的迷惑行为 安装Onedrive&#xff0c;如果勾选了同步&#xff0c;会默认把当前用户的数个文件夹&#xff08;桌面、文档、图片、下载 等等&#xff09;移动到安装时提示的那个文件夹 查看其中的一个文件的路径&#xff1a; 这样一整&#xff0c;原来的文件收到严重影…

政安晨:【Keras机器学习示例演绎】(三十五)—— 使用 LayerScale 的类注意图像变换器

目录 简介 导入 层刻度层 随机深度层 类注意力 会说话的头注意力 前馈网络 其他模块 拼凑碎片&#xff1a;CaiT 模型 定义模型配置 模型实例化 加载预训练模型 推理工具 加载图像 获取预测 关注层可视化 结论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#…

Topaz Video AI 5.0.3激活版 AI视频无损缩放增强

Topaz Video AI专注于很好地完成一些视频增强任务&#xff1a;去隔行&#xff0c;放大和运动插值。我们花了五年时间制作足够强大的人工智能模型&#xff0c;以便在真实世界的镜头上获得自然的结果。 Topaz Video AI 还将充分利用您的现代工作站&#xff0c;因为我们直接与硬件…

【数学建模】矩阵微分方程

一、说明 我相信你们中的许多人都熟悉微分方程&#xff0c;或者至少知道它们。微分方程是数学中最重要的概念之一&#xff0c;也许最著名的微分方程是布莱克-斯科尔斯方程&#xff0c;它控制着任何股票价格。 ​​ 股票价格的布莱克-斯科尔斯模型 微分方程可以由数学中的许多…

MidJourney提示词大全

大家好&#xff0c;我是无界生长。 这篇文章分享一下MidJourney提示词&#xff0c;篇幅内容有限&#xff0c;关注公众号&#xff1a;无界生长&#xff0c;后台回复&#xff1a;“MJ”&#xff0c;获取全部内容。 我是无界生长&#xff0c;如果你觉得我分享的内容对你有帮助&…

ArcGIS软件:地图投影的认识、投影定制

这一篇博客介绍的主要是如何在ArcGIS软件中查看投影数据&#xff0c;如何定制投影。 1.查看地图坐标系、投影数据 首先我们打开COUNTIES.shp数据&#xff08;美国行政区划图&#xff09;&#xff0c;并点击鼠标右键&#xff0c;再点击数据框属性就可以得到以下的界面。 我们从…

【Mac】graphpad prism for Mac(专业医学绘图工具) v10.2.3安装教程

软件介绍 GraphPad Prism for Mac是一款专业的科学数据分析和绘图软件&#xff0c;广泛用于生物医学和科学研究领域。它具有强大的统计分析功能&#xff0c;可以进行各种数据分析&#xff0c;包括描述性统计、生存分析、回归分析、方差分析等。同时&#xff0c;它还提供了丰富…

C++奇迹之旅:string类接口详解(上)

文章目录 &#x1f4dd;为什么学习string类&#xff1f;&#x1f309; C语言中的字符串&#x1f309;string考察 &#x1f320;标准库中的string类&#x1f309;string类的常用接口说明&#x1f320;string类对象的常见构造 &#x1f6a9;总结 &#x1f4dd;为什么学习string类…

FFmpeg学习记录(二)—— ffmpeg多媒体文件处理

1.日志系统 常用的日志级别&#xff1a; AV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_DEBUG #include <stdio.h> #include <libavutil/log.h>int main(int argc, char *argv[]) {av_log_set_level(AV_LOG_DEBUG);av_log(NULL, AV_LOG_DEBUG, "hello worl…

Cisco Nexus Dashboard 3.1(1k) - 云和数据中心网络管理软件

Cisco Nexus Dashboard 3.1(1k) - 云和数据中心网络管理软件 跨数据中心和云实现集中配置、运行和分析。 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-nexus-dashboard/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sys…

根据docker部署nginx并且实现https

目录 一、Docker中启用HTTPS有几个重要的原因 二、https介绍 三、https过程 四、安装docker-20.10.18 五、如何获取证书 通过阿里云获取证书 六、docker部署nginx并且实现https 6.1准备证书 6.2准备nginx.conf 和 index.html文件 6.3生成容器 6.4浏览器验证证书 一、…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑碳捕集和电转气的综合能源系统优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

STM32标准库控制一盏LED闪烁

实物连接&#xff1a; ## 软件编程&#xff1a;默认已经有一个工程模板&#xff0c;代码实现逻辑&#xff1a; 1、使用RCC开启GPIO的时钟&#xff1b; 2、使用GPIO初始化函数实现初始化GPIO 3、使用输入或输出的函数控制GPIO口 #include "stm32f10x.h" …

JavaEE 多线程详细讲解(1)

1.线程是什么 &#xff08;shift F6&#xff09;改类名 1.1.并发编程是什么 &#xff08;1&#xff09;当前的CPU&#xff0c;都是多核心CPU &#xff08;2&#xff09;需要一些特定的编程技巧&#xff0c;把要完成的仍无&#xff0c;拆解成多个部分&#xff0c;并且分别让…