map和set

文章目录

  • 关联式容器
    • pair
    • 树形结构的关联式容器
    • set
    • multiset
    • map
    • multimap

正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。

关联式容器

我们前面接触的vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。

什么是键值对?

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。

pair

pair就是C++内置的一个键值对。
在这里插入图片描述
在这里插入图片描述
first就是Key,second就是value。

我们看那一下pair的构造函数。
在这里插入图片描述

它的第二个构造函数就保证了它只要first之间是可以相互赋值就就可以,因为它的构造函数又套了一个模板参数,所以如果u,v和T1,T2相等就是拷贝构造函数,如果不相等就是构造函数,所以它既是拷贝构造也是构造。

在这里插入图片描述
我们可以看到pair<string,int>和pair<char*,int> 不是同一个类型,理论上是不可以相互赋值的,正是因为有了这个模板的存在,只要first和second可以相互赋值,不同类型pair就可以相互赋值。

但是我们一般不直接写pair来构造pair,我们都用make_pair.

make_pair
在这里插入图片描述
make_pair可以根据我们传递的类型帮我们返回一个对应的pair。

树形结构的关联式容器

树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。

set

在这里插入图片描述

  1. set是按照一定次序存储元素的容器。
  2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

插入

在这里插入图片描述

我们可以看到这里的插入是一个val_type,val_type是什么呢?
在这里插入图片描述
我们可以看到val_type就是T。

void func()
{
	set<int> s;
	s.insert(6);
	s.insert(2);
	s.insert(3);
	s.insert(4);
	s.insert(5);
	s.insert(0);
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

我们可以看到insert的返回值是一个pair,pair的first是这个位置的迭代器,second是是否插入成功。

删除

在这里插入图片描述
删除可以删除一个迭代器的位置,也可以直接删除一个val_type,也可以直接删除一个迭代器区间。

void func1()
{
	set<int> s;
	s.insert(6);
	s.insert(2);
	s.insert(3);
	s.insert(4);
	s.insert(5);
	s.insert(0);

	s.erase(0);
	set<int>::iterator it = s.begin();
	s.erase(it);

	it = s.begin();

	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

查找

在这里插入图片描述

在这里插入图片描述

查找是返回这个值的迭代器。可以配合删除使用。如果找不到会返回end()的位置。

lower_bound和upper_bound

在这里插入图片描述在这里插入图片描述
lower_bound会返回大于等于val的位置的迭代器,而upper_bound会返回大于val的位置迭代器。
这两个函数一般是配合使用的,我们可以通过这两个函数来遍历,某一段区间内的值,或者删除某一段区间的值。

void func2()
{
	set<int> s;
	for (size_t i = 0; i < 10; i++)
	{
		s.insert(i * 10);
	}
	set<int>::iterator it1, it2;
	it1 = s.lower_bound(30);
	it2 = s.upper_bound(60);
	while (it1 != it2)
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
}

equal_range
在这里插入图片描述

equal会返回该val位置的迭代器,和大于该val的迭代器。并且把他们放到一个pair中,first是val的位置的迭代器,second是大于val位置的迭代器。

void func3()
{
	set<int> s;
	for (size_t i = 0; i < 10; i++)
	{
		s.insert(i * 10);
	}
	auto m = s.equal_range(20);
	
	cout << *m.first << endl; // 20
	cout << *m.second<<endl;  // 30
}

multiset

在这里插入图片描述
multiset和set一样,只不过multiset允许键值相同,而set是不允许键值相同的。只不过multiset在删除是,会把那个键值的所有值都删了,并不会只删除一个。

总结:

  • set是排序加去重的
  • 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。

插入

map就是一个K,V模型,里面存的是pair,所以我们要插入就是要插入一个pair。

在这里插入图片描述
如果插入成功会返回那个位置的迭代器,如果那个值已经存在了,就会返回那个位置的迭代器,所以insert还充当的有find的功能。后面的[]重载也是主要有insert实现的。

void func()
{
	map<string, string> mymap;
	mymap.insert(make_pair("sort", "排序"));
	mymap.insert(make_pair("left", "左边"));
	mymap.insert(make_pair("right", "右边"));

	map<string, string>::iterator it = mymap.begin();
	while (it != mymap.end())
	{
		cout << it->first << ":" << it->second << endl;
		++it;
	}
}

然后删除什么的和set的用法都是一样的,只是map重载了[]运算符,我们主要说一下这个。

在这里插入图片描述

在这里插入图片描述
我们会看到insert就是调用了insert这个函数,那么为什么可以这样呢?

因为insert如果不存在就会插入成功并且返回该位置的迭代器,如果这个值已经存在,就会插入失败并且也会返回这个位置的迭代器,所以我们不用管是不是插入成功了,都能够得到这个位置的迭代器。

比如统计次数我们就可以这样写:

void func1()
{
	map<string, int> countMap;
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };

	for (auto e : arr)
	{
		countMap[e]++;
	}

	map<string, int>::iterator it = countMap.begin();
	while (it != countMap.end())
	{
		cout << it->first << ":" << it->second << endl;
		++it;
	}
}

multimap

在这里插入图片描述

multimap也是允许键值冗余,所以它就没办法重载[]。其他的和map都一样。

总结:

  • map和set通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
  • map和set都是会进行排序和去重的,只不过map排序的是Key值,而multiset和multimap是不会去重的。
  • map是KV模型而set是K模型。
  • 它们的接口大多相似,会用一个其他的类似就好了,唯一就是map重载了[]。

那么今天的分享就到这里了,有什么不懂得可以私信博主,或者添加博主的微信,欢迎交流。

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

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

相关文章

使用drawio的图层构建更强大的图表

drawio中使用图层 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cnhttps://www.drawon.cn?useSourcecsdn内部完整的集成了drawio的所有功…

SourceTree提示128错误

错误&#xff1a; SourceTree打开报错&#xff1a;git log 失败&#xff0c;错误代码128 错误截图&#xff1a; 解决方法&#xff1a; 第一种&#xff1a; 打开电脑路径 C:\Users\Administrator &#xff0c;删除下面的【.gitconifg】文件 第二种&#xff1a; 如果上述方法…

微服务学习 | Ribbon负载均衡、Nacos注册中心、微服务技术对比

Ribbon负载均衡 负载均衡流程 负载均衡策略 通过定义IRule实现可以修改负载均衡规则&#xff0c;有两种方式&#xff1a; 1. 代码方式:在服务消费者order-service中的OrderApplication类中&#xff0c;定义一个新的IRule: 2.配置文件方式: 在order-service的application.yml…

React经典初级错误

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者&#xff0c;我们创造bug&#xff0c;传播bug&#xff0c;毫不留情地消灭bug&#xff0c;在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案&#xff0c;感兴…

如何实现业务系统的单点退出

当前我国各领域正在加速向数字化、移动化、智能化发展&#xff0c;大力投入信息化建设与数字化转型已成为企业的共识&#xff0c;但对于很多企业而言&#xff0c;组织信息环境庞大复杂&#xff0c;业务场景变化频繁&#xff0c;给身份管理与信息安全管理带来很大挑战。随着信息…

时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)

时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM) 目录 时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)预测效果基本介绍程序设计参考资料预测效果 基本介绍 时序预测 | Python实现ConvLSTM卷积长短期记忆神…

国产高云FPGA:OV5640图像视频采集系统,提供Gowin工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐国产高云FPGA相关方案推荐国产高云FPGA基础教程 3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条Video Frame Buffer 图像缓存DDR3 Memory Interface 4、Gowin工程详解5、上板调试验证并演示准备工作静态演示 6、福利&#xff1…

全网火爆,接口自动化测试框架-fixture函数使用,一篇打通...

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

JDK 9 Map.of()

//Java 9 Map.of //private static final int SIZE 10;

RabbitMQ 部署及配置详解(集群部署)

单机部署请移步&#xff1a; RabbitMQ 部署及配置详解 (单机) RabbitMQ 集群是一个或 多个节点&#xff0c;每个节点共享用户、虚拟主机、 队列、交换、绑定、运行时参数和其他分布式状态。 一、RabbitMQ 集群可以通过多种方式形成&#xff1a; 通过在配置文件中列出群集节点以…

技术分享 | JMeter性能测试实现与分析

导语 JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具&#xff0c;它即能测试动态服务&#xff08;WebService&#xff09;&#xff0c;也能测试静态资源&#xff0c;包括Servlet服务、CGI脚本等&#xff0c;还能测试动态语言服务&#xff08;PHP、Java、ASP…

二次元通用PPT模版

二次元通用PPT模版 共&#xff1a;19页 PPT模版&#xff1a;百度网盘 请输入提取码&#xff1a;4s3f

分布式任务调度-XXL-job

源码仓库地址 http://gitee.com/xuxueli0323/xxl-job 前置环境 docker容器环境配置 拉取msyql镜像&#xff1a; docker pull mysql:5.7创建mysql容器: docker run -p 3306:3306 --name mysql57 \ -v /opt/mysql/conf:/etc/mysql \ -v /opt/mysql/logs:/var/log/mysql \ -v …

一文带您了解什么是渲染农场

很多第一次接触渲染农场的朋友可能渲染农场都有些什么服务、渲染农场怎么收费和渲染农场怎么收费这样的疑问&#xff0c;今天小编就来给大家说一下吧。 什么是渲染农场&#xff1f; 目前&#xff0c;行业内普片认为&#xff1a;渲染农场是一种渲染服务&#xff0c;可以提供强…

剑指Offer || 116.省份数量

题目 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有相连的城市。 …

如何使用ONLYOFFICE来P惊悚特效图

如何使用ONLYOFFICE来P惊悚特效图 老朋友们可能会经常看见本号主又换头像了&#xff0c;各种各样精神分裂成一群人或者我和自己俩个人的头像&#xff0c;之前讲过的&#xff1a; 手把手教你如何自己一个人精神分裂成一群人https://mp.weixin.qq.com/s/yacKt7N3sZnarfMhXRNdBA…

JDK1.8 新特性(二)【Stream 流】

前言 上节我们学了 lambda 表达式&#xff0c;很快我就在 Flink 的学习中用到了&#xff0c;我学的是 Java 版本的 Flink&#xff0c;一开始会以为代码会很复杂&#xff0c;但事实上 Flink 中很多地方都用到了 函数接口&#xff0c;这也让我们在编写 Flink 程序的时候可以使用 …

2023亚太杯数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

在线协作工具都有哪些?推荐这10款

如今&#xff0c;互联网的快速发展不仅改变了我们的生活方式&#xff0c;也改变了我们的工作方式。 特别是对于一些与产品设计相关的公司或团体&#xff0c;网络不仅为其设计提供了稳定的资源和灵感&#xff0c;而且为成员之间的沟通和合作提供了更大的便利。 如果您也需要为…

【Proteus仿真】【51单片机】公交车报站系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD12864显示模块、DS18B20温度传感器、DS1302时钟模块、按键、LED蜂鸣器、ULN2003、28BYJ48步进电机模块等。 主要功能&#xff1a; 系统运行后&…