setmap使用

news2024/11/22 17:02:07

目录

set使用

set的模板参数

构造函数

成员函数 insert

iterator

​编辑 

 

find

count

pair

pair 的模板参数

make_pair

multiset使用

multiset 的模板参数

set 与 multiset 的区别

count 

map使用

map 的模板参数

构造函数

insert

iterator

find

​编辑 

count

operator[]

multimap使用

multimap与map 的区别


set使用

set的模板参数

set 是一个 key 模式的结构,底层使用的是红黑树。

set 可以给一个类型,由于底层使用的是红黑树,所以 key 一定要支持比较,所以还有一个 compare的模板参数,这里可以给仿函数类型,还有一个就是空间配置器,空间配置器我们不多说。

构造函数

 构造函数,我们常用的就是一个空的构造,或者是用一段迭代器区间来构造。

	vector<int> v{ 1,2,3,4,5,6,7,8,9 };
	set<int> se(v.begin(), v.end());

这样就构造好了,当然任何迭代器都可以。

那么我们遍历一下。

	for (auto e : se)
		cout << e << " ";
	cout << endl;

这里我想应该都能看明白,范围for,也就是底层使用的是迭代器替换。

实际上我们的迭代器遍历一遍也就类似于中序。

其实这里并不是我们给的有序然后才有序的,这里即使是无序,经过set后也是有序的。

	vector<int> v{ 2,3,1,8,3,2,9,9,4,0,3,4,6,7,6,6,6,2 };
	set<int> se(v.begin(), v.end());

	for (auto e : se)
		cout << e << " ";
	cout << endl;

 我们给这么一段数据,我们再看一下。

经过遍历后我们发现不仅有序还顺便去重了。

因为 set 就像我们上次的二叉搜索树一样,需要用key来比较大小然后插入,所以无法插入两个相同的值。 

成员函数 insert

 

 关于 set 的 insert 我们只看这么一个,因为只有这个最常用。

参数:参数就是 value_type 类型的一个参数,value_type 又是什么类型呢?

value_type 就是模板中的类型 T。

返回值 :返回值是一个 pair 其中 pair 的第一个参数是插入后的迭代器,或者是插入失败后的那个位置。

上面我们有一个 pair ,pair 是什么类型呢?我们下面,这里先不说。

	set<int> se;
	se.insert(10);
	se.insert(3);
	se.insert(1);
	se.insert(9);
	se.insert(6);
	se.insert(8);
	se.insert(2);
	for (auto e : se)
		cout << e << " ";
	cout << endl;

这个就是我们单元素的插入,而这个也是最常用的。

iterator

 

 set 的迭代器呢,是一个双向迭代器,并且还是 const value_type,所以set 的迭代器里面的值是不能修改的。

	vector<int> v{ 2,3,1,8,3,2,9,9,4,0,3,4,6,7,6,6,6,2 };
	set<int> se(v.begin(), v.end());

	for (auto& e : se)
		cout << ++e << " ";
	cout << endl;

 我们还是使用上面的一段代码,但是这里在使用范围for 的时候加了引用,我们编译一下。

 所以set 的key 其实是不可修改的。

 

find

set 也提供了 find 就是查找传入的一个值,如果查到了就返回该位置的迭代器,否则就返回 iterator::end()

那么算法里面的查找和set提供的查找有什么不同吗?

 

	set<int>::iterator it1 = find(se.begin(), se.end(), 1);
	if (it1 != se.end())
		cout << (*it1) << endl;
	auto it2 = se.find(1);
	if (it2 != se.end())
		cout << (*it2) << endl;

 这里我们就用到 auto 了,可以自动推导返回值类型。

那么上面的这两个有什么区别呢?

区别:

  • 算法里面的查找是一个一个查找,也就是通过迭代器一个一个遍历,时间复杂度为 O(N)
  • set提供的find,的查找是搜索树的查找,时间复杂度为O(N logN)

count

 set 除了提供了 find 还提供了 count,count也是和set一样的查找功能,但是返回值有差异,set返回查找到的迭代器,count返回查找到的个数。

那么对于 set 来说只能插入不同的值,要返回值个数有什么用呢?

其实这里的 count 是为了下面说的 multiset 设计,但是为了匹配一点,set 也设计了该函数。

所以这里也就不多介绍。

pair

pair 的模板参数

 pair 就是一个模板的类,其中有两个值,一个是 first,另一个是second。

make_pair

make_pair 是一个模板函数,其作用就是返回饭hi一个构造的pair。 

 

multiset使用

multiset 的模板参数

在模板参数这边,set 与 multiset 是一样的。

set 和 multiset 的区别就是set 只能插入不同值的元素,但是 multiset 可以插入相同值的元素。

所以下面的 multiset 我们就只看一下插入相同元素后遍历后的结果。

set 与 multiset 的区别

	vector<int> v{ 2,3,1,8,3,2,9,9,4,0,3,4,6,7,6,6,6,2 };
	multiset<int> muset(v.begin(), v. end());

	for (auto e : muset)
		cout << e << " ";
	cout << endl;


相比set来说 multiset 即使是插入多个相同元素也是没有问题的。

count 

multiset 的count 函数就是可以返回查找到元素的个数了,set 只能返回 1或者 0,但是multiset 还可以返回大于 1 的值,因为这里的 multoset 可以存入相同的值。

map使用

map 的模板参数

 map 是一个 key value 的模型,一个 key 对应一个value,所以key 也同样不可以重复。

还有一个T,T就表示的是 value 的类型。

map 同样和 set 是一样的,还是需要提供一个模板参数关于比较的。

还有一个空间配置器,这里也不多介绍。

构造函数

map 的构造函数也是可以用一段区间来初始化。

	map<char, int> first{ {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };

	map<char, int> second(first.begin(), first.end());
	for (auto e : second)
		cout << e.first << " : " << e.second << endl;

 先不要管我们下面的打印,我们先看一下能否遍历。

insert

 这里 map 的插入也是返回一个 pair。

那么这里插入的 value 是什么呢?

这里的 value_type 是一个pair,所以我们插入的值也是一个pair。

这里的返回值是什么意思呢?

其中如果插入成功就返回的pair里面的 first 就是插入成功位置的迭代器,second 就是true,失败的话 first 就是一个已有的那个 key 的迭代器,second 就是false。

	map<int, int> hash;

	pair<int, int> pair1(1, 11);
	hash.insert(pair1);

	hash.insert(pair<int, int>(2,22));

	hash.insert(make_pair(3, 33));

 这个就是插入,这里主要是为了介绍几种插入方式,其中一个是构造一个 pair 对象,然后插入,还有一个是使用pair 的匿名对象,最后一个就是我们前面介绍的 make_pair 函数,该函数返回一个pair的对象。

iterator

这里的迭代器就是一个 value_type,并且也是双向迭代器。

find

 

这里的 find 返回的也是一个迭代器,而这里的迭代器又是一个 value_type类型的,所以查找到的值,里面的 first 就是key, second 就是value。

	map<char, int> hash{ {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };

	auto it = hash.find('a');
	if (it != hash.end())
		cout << (*it).first << ":" << (*it).second << endl;

 

count

 

map 的 count 也是和 set 是一样的,主要也是为了 multimap 设计的。

operator[]

operato[] 可以说是map 里面很重要的一个内容了,而且operator[] 同样很好用。

这里的 [] 里面传入的值是一个 key 类型的数据。

operator[] 的作用:

如果没有该元素,就插入,有的话,就返回该 key 对应的 value。

是怎么做到的?

其中 operator[] 是使用 insert 来实现的,

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

 其实大概就是这样实现的。

multimap使用

multimap与map 的区别

这里的 multimap 与 map 实际上和 set 与 multiset 是差不多的,multimap 可以插入相同元素的值,而map 是不可以的。

其中 count 函数也就是为 multimap 设计的。

那么他们的区别是什么呢? 我觉得最大的几个区别就是上面的一个,还有一个就是multimap 是没有 operator[]  的。

因为 multimap 可以插入相同元素的值,那么operator[] 里面传入的是key, 返回的是 value,但是这里的key 不是唯一的,所以没有 operator[].

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

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

相关文章

ChatGPT: 人机交互的未来

ChatGPT: 人机交互的未来 ChatGPT背景ChatGPT的特点ChatGPT的应用场景结论 ChatGPT ChatGPT是一种基于大数据和机器学习的人工智能聊天机器人模型。它由国内团队发明、开发&#xff0c;并被命名为Mental AI。ChatGPT的目标是通过模拟自然对话的方式&#xff0c;提供高效、智能…

Zebec 创始人 Sam 对话社区,“Zebec 生态发展”主题 AMA 回顾总结

近日&#xff0c;Zebec Protocol 创始人 Sam 作为嘉宾&#xff0c;与社区进行了以“Zebec 生态发展”为主题的 AMA 对话。Sam 在线上访谈上对 Zebec 路线图、Zebec 质押、NautChain通证进行了解读&#xff0c;并对 Zebec 的进展、生态建设的愿景进行了展望。本文将对本次 AMA 进…

【C++】语法小课堂 --- auto关键字 typeid查看实际类型 范围for循环 空指针nullptr

文章目录 &#x1f35f;一、auto关键字&#xff08;C11&#xff09;&#x1f369;1、auto的简介&#x1f369;2、auto的使用细则&#x1f6a9;auto与指针和引用结合起来使用&#x1f6a9; 在同一行定义多个变量 &#x1f369;3、auto不能推导的场景1️⃣auto不能作为函数的参数…

GD32F103VE窗口看门狗定时器

GD32F103VE窗口看门狗定时器 看门狗定时器(WDGT)有两个&#xff1a; 1&#xff0c;独立看门狗定时器(FWDGT) 2&#xff0c;窗口看门狗定时器(WWDGT) 窗口看门狗定时器开启后&#xff0c;其7位向下递减计数器工作。 当"向下递减计数器"的计数值达到"预设的窗口…

【Unity3D】消融特效

1 前言 选中物体消融特效中基于 Shader 实现了消融特效&#xff0c;本文将基于 Shader Graph 实现消融特效&#xff0c;两者原理一样&#xff0c;只是表达方式不同&#xff0c;另外&#xff0c;选中物体消融特效中通过 discard 丢弃片元&#xff0c;本文通过 alpha 测试丢弃片元…

Linux中su/su -/sudo的区别

参考Linux中su/su -/sudo的区别 - 知乎 Linux中su/su -/sudo的区别 程序员张同学 ​ 深圳市悦照琉璃科技有限公司 全栈工程师 6 人赞同了该文章 在linux中会经常使用到su/su -/sudo这三个命令&#xff0c;总结一下这三个命令的区别。 su 使用root密码&#xff0c;切换到…

动力节点|Java零基础教程,老杜带你一套通关Java基础

对于零基础自学Java来说&#xff0c;Java的学习过程可能会有一些困难&#xff0c;但只要掌握了相关的基础知识和技能&#xff0c;就可以很快地上手。 Java需要循序渐进而且系统的学习&#xff0c;基础不牢地动山摇&#xff0c;一套全面且适合零基础自学的入门教程&#xff0c;尤…

类的定义

一、定义类 类&#xff08;class&#xff09;是用户自定义数据类型。如果程序中要使用类类型&#xff0c;必须根据实际需要定义&#xff0c;或者使用已设计好的类。 class 类名 {成员列表 }; 类可以没有成员&#xff0c;也可以有多个成员。类成员可以是数据或者函数。所有成…

Java项目作业~ 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作

需求&#xff1a; 创建基于Maven的Java项目&#xff0c;连接数据库&#xff0c;实现对站点信息的管理&#xff0c;即实现对站点的新增&#xff0c;修改&#xff0c;删除&#xff0c;查询操作。 以下是站点表的建表语句&#xff1a; CREATE TABLE websites (id int(11) NOT N…

动态路由协议 ospf

动态路由协议的分类 rip : 距离矢量路由协议&#xff08;容易产生环路&#xff09;ospf&#xff1a; 链路状态路由协议&#xff08;比较耗费资源&#xff0c;但是链路准确性好&#xff09;bgp&#xff1a; 外部网关协议 RIP OSPF LSA泛洪 LSDB维护 SPF计算&#xff08;最短路…

指令重排相关

指令流水线所带来的一些问题 结构冒险 流水线中出现硬件资源竞争 数据冒险 流水线中后面的指令需要等待前面指令完成数据的读写 控制冒险 流水线需要个怒前面指令的执行结果来决定下一步去哪儿之行 为了解决指令流水线的数据冒险所带来的停顿、CPU 搞了个乱序执行。 在遇到数…

关于Godot游戏引擎制作流水灯

先上核心代码 游戏节点 流水灯的通途可以是 1. 装饰 2. 音乐类多媒体程序&#xff08;如FL中TB-303的步进灯&#xff09; FL Studio Transistor Bass

TypeScript 中【class类】与 【 接口 Interfaces】的联合搭配使用解读

导读&#xff1a; 前面章节&#xff0c;我们讲到过 接口&#xff08;Interface&#xff09;可以用于对「对象的形状&#xff08;Shape&#xff09;」进行描述。 本章节主要介绍接口的另一个用途&#xff0c;对类的一部分行为进行抽象。 类配合实现接口 实现&#xff08;impleme…

8.7工作总结

一、我们想自定义一个titileBar出现如下这种情况&#xff0c;发现他原来的titileBar还未隐藏。 后来我尝试修改主题使得他没有主题noActionBar发现也不行&#xff0c;后来我参考原先我看过的项目使用了如下代码 this.getActionBar().hide();发现会报这个错误java.lang.NullPoi…

30.基于XML的声明式事务

基于XML的声明式事务 主要是使用XML去代替注解&#xff0c;来实现起到代替注解的作用&#xff0c;实际使用频率很低 将BookServiceImpl.java中的Transactional注解删除&#xff0c;确保用户余额充足 spring-tx-xml.xml <?xml version"1.0" encoding"UTF-8…

Android AccessibilityService研究

AccessibilityService流程分析 AccessibilityService开启方式AccessibilityService 开启原理 AccessibilityService开启方式 . 在Framework里直接添加对应用app 服务component。 loadSetting(stmt, Settings.Secure.ACCESSIBILITY_ENABLED,1); loadSetting(stmt, Settings.Se…

mybatis-plus的update方法,到底会不会更新null值?看这一篇就够了

普通的设置值。需要传入一个Wrapper对象 默认情况下是不会更新null值的&#xff0c;也就是只更新设置值的字段 LambdaUpdateWrapper<OrderChildRoom> orderChildRoomUpdateWrapper new LambdaUpdateWrapper<>();orderChildRoomUpdateWrapper.set(OrderChildRoo…

【PDF密码】PDF文件不能打印,为什么?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

面试热题(滑动窗口最大值)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&#xff1a;[3,3,5,…