【C++历险记】STL之set详解

news2024/10/7 15:27:38

个人主页:兜里有颗棉花糖💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓
在这里插入图片描述

目录

  • set
    • Modifiers
      • insert(插入数据)
      • erase(删除元素)
    • Operations:
      • find(查找数据)
      • count
        • find函数和count函数的区别
      • lower_bound & upper_bound
    • 补充(multiset)
      • equal_range

set

集合(Set):是一种不允许重复元素的容器,它的元素是按照某种特定顺序组织的。

头文件:

  • #include<set>

迭代器访问:

// 方式1:
set<int>::iterator it = s.begin();
while (it != s.end())
{
	cout << *it << ' ';
	it++;
}
// 方式2
for (auto e : s)
	cout << e << ' ';
// 方式3
for (set<int>::iterator it1 = s.begin(); it1 != s.end(); it1++)
	cout << *it1 << ' ';
// 其实这里方式1和方式3是等同的

Modifiers

insert(插入数据)

void test_set1()
{
	set<int> s;
	s.insert(1);
	s.insert(2);
	s.insert(3);
	s.insert(4);
	s.insert(4);
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << ' ';
		it++;
	}
	cout << endl;
}

运行结果如下:
在这里插入图片描述
可以看到结果中并没有打印两个4,因为set容器会对其中的元素进行去重操作。

erase(删除元素)

void test_set2()
{
	set<int> s;
	s.insert(1);
	s.insert(2);
	s.insert(3);
	s.insert(4);
	s.insert(4);
	set<int>::iterator it = s.begin();
	for (auto e : s)
		cout << e << ' ';
	cout << endl;
	// 删除元素方式1
	auto pos = s.find(3);
	s.erase(pos);
	//s.erase(3); // 删除元素方式2
	for (auto e : s)
		cout << e << ' ';
	cout << endl;
}

运行结果如下:
在这里插入图片描述

上面提供了两种删除元素的方式,我们要根据不同的场景来选择不同的方式来进行删除元素。

Operations:

find(查找数据)

set的find函数用于在set中查找指定的元素,如果找到了,它返回指向该元素的迭代器;如果没有找到,返回一个指向set末尾元素的迭代器
在这里插入图片描述

请看举例:

void test_set3()
{
	set<int> s;
	s.insert(1);
	s.insert(2);
	s.insert(3);
	s.insert(4);
	s.insert(4);
	auto pos1 = s.find(5);
	auto pos2 = s.find(4);
	if (pos1 != s.end())
		s.erase(pos1);
	else
		cout << "没找到该元素" << endl;
	if (pos2 != s.end())
		s.erase(pos2);
	for (auto e : s)
		cout << e << ' ';
}

运行结果如下:

在这里插入图片描述
需要注意的是,set的find函数和库中的find函数是不同的函数。

区别主要是查找速度上,set的find函数查找元素的时间复杂度是O(logN)

而库中的find函数查找的速度是O(N)

所以日常当中如果我们需要使用set中的find函数来查找元素时,我们可以这样使用,请看:

set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(4);
if (s.find(4) != s.end())
	cout << "该元素已被找到" << endl;
else
	cout << "未找到该元素" << endl;

count

在这里插入图片描述
如果该元素存在的话则返回1,否则返回0。

这里只举一个简单的例子即可,请看:

set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(4);
if (s.count(4))
	cout << "集合中存在该元素" << endl;
else
	cout << "集合中不存在该元素" << endl;

运行结果如下:
在这里插入图片描述

find函数和count函数的区别

set的find函数和count函数都是用来查找集合元素的函数,但要说区别的话还是有的。

返回值:find函数返回一个指向集合元素的迭代器,如果集合中不存在该元素,则迭代器指向集合的末尾;而count函数则返回集合中值等于给定值的元素数量,因为集合中元素是唯一的,所以返回值只能是0或1。

时间复杂度:count函数的时间复杂度要比find函数快,因为count函数只需要确定是否存在该元素,而不必遍历整个集合。

如果只需要知道一个元素是否存在于集合中,可以使用count函数;如果需要获取该元素的迭代器,或者对集合进行修改、删除、插入等操作,就需要使用find函数。

lower_bound & upper_bound

lower_bound函数用于查找大于或等于指定元素的第一个元素的迭代器如果找到指定元素,则返回指向该元素的迭代器,否则返回指向set末尾(即end)的迭代器。

upper_bound函数用于查找大于指定元素的第一个元素的迭代器;如果没有找到则返回指向set末尾(即end)的迭代器。

请看举例:

void test_set5()
{
	set<int> s;
	for (int i = 1; i <= 10; i++) s.insert(i * 10); // 10 20 30 40 50 60 70 80 90 100

	set<int>::iterator itlow, itup;
	itlow = s.lower_bound(30), itup = s.upper_bound(60);
	cout << *itlow << ' ' << *itup << endl;
	s.erase(itlow, itup);
	for (auto e : s) cout << e << ' ';
	cout << endl;
}

运行结果如下:
在这里插入图片描述

这里我们需要注意的是,erase函数删除的范围是左闭右开的,即实际删除的元素包括第一个迭代器指向的元素,但不包括第二个迭代器指向的元素。
同时这里要再次强调lower_bound函数查找的是大于或等于指定元素的第一个元素的迭代器,而upper_bound用于查找大于指定元素的第一个元素的迭代器。

补充(multiset)

这里要补充一点,在C++中setmultiset是C++标准库中的两个关联容器,二者的唯一区别在于容器中的元素是否唯一

这里举一个简单的例子即可,请看:

void test_set6()
{
	multiset<int> s;
	s.insert(1);
	s.insert(2);
	s.insert(4);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	s.insert(3);
	s.insert(6);
	for (auto e : s) cout << e << ' ';
	cout << endl;
	cout << "容器中元素5的个数是:" << s.count(5) << endl;
	
	auto ret = s.equal_range(5);
	auto itlow = ret.first;
	auto itup = ret.second;
	s.erase(itlow, itup);
	for (auto e : s) cout << e << ' ';
	cout << endl;
}

运行结果如下:
在这里插入图片描述

这里我们要注意的是,如果multiset容器中有多个元素5,那么,如果使用find函数来查找元素5的话,此时应该返回的是中序的第一个元素5。请看举例:

multiset<int> s;
s.insert(1);
s.insert(2);
s.insert(4);
s.insert(5);
s.insert(5);
s.insert(5);
s.insert(3);
s.insert(6);
for (auto e : s) cout << e << ' ';
cout << endl;
auto pos = s.find(5);
while (pos != s.end())
{
	cout << *pos << ' ';
	pos++;
}
cout << endl;

运行结果如下:
在这里插入图片描述

equal_range

我们其实可以认为count函数和equal_range函数就是专门为multiset容器设计的。因为set容器中不存在相等的值,而multiset容器才存在相等的值。

下面我们来看一下multiset容器是如何使用equal_range函数的。

方式1:

void test_multiset1()
{
	multiset<int> s;
	s.insert(1);
	s.insert(2);
	s.insert(4);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	s.insert(3);
	s.insert(6);
	for (auto e : s) cout << e << ' ';
	cout << endl;
	auto ret = s.equal_range(5);
	auto itlow = ret.first;
	auto itup = ret.second;

	s.erase(itlow, itup);
	for (auto e : s) cout << e << ' ';
	cout << endl;
}

在这里插入图片描述

方式2:
在这里插入图片描述
这里注意itlow和itup迭代器指向的值。

错误演示1:
在这里插入图片描述

这里equal_range返回的是一个不存在的区间。所以最终肯定会报错。

错误演示2:

在这里插入图片描述
这里出错点就在于返回给itup的值是一个不合法的值,所以*itup的时候就会报错。

以上就是对set容器用法的介绍,本文就到这里吧,再见啦友友们!!!

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

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

相关文章

29.第三方登录

1►第三方登录 当今社会&#xff0c;微信登录、QQ登录、抖音登录等等三方登录已经层出不穷&#xff0c;学会三方登录势在必行。 微信登录要认证开发者&#xff0c;必须为企业&#xff0c;个人不行&#xff0c;而且还要交300块钱。 QQ登录也要申请、微博登录也要申请。 还好…

为什么重写equals方法必须重写hashcode方法

在Java中&#xff0c;重写equals()方法的同时也应该重写hashCode()方法&#xff0c;这是因为这两个方法在 Java 中是有关联的&#xff0c;而且它们一起影响着集合类的行为。 Java中的hashCode()方法用于返回对象的哈希码&#xff0c;而equals()方法用于比较两个对象是否相等。…

[文件读取]webgrind 文件读取 (CVE-2018-12909)

1.1漏洞描述 漏洞编号CVE-2018-12909漏洞类型文件读取漏洞等级⭐⭐⭐漏洞环境VULFOCUS攻击方式 1.2漏洞等级 高危 1.3影响版本 Webgrind 1.5版本 1.4漏洞复现 1.4.1.基础环境 1.4.2.前提 网站后台地址&#xff1a; 后台管理账密&#xff1a; 后台登录地址 1.5深度利用 …

【rl-agents代码学习】02——DQN算法

文章目录 Highway-env Intersectionrl-agents之DQN*Implemented variants*:*References*:Query agent for actions sequence探索策略神经网络实现小结1 Record the experienceReplaybuffercompute_bellman_residualstep_optimizerupdate_target_network小结2 exploration_polic…

spring 整合 JUnit

大家好&#xff0c;本篇博客我们通过spring来整合JUnitt单元测试框架。 在之前篇章的测试方法中&#xff0c;几乎都能看到以下的两行代码&#xff1a; ApplicationContext context new ClassPathXmlApplicationContext("xxx.xml"); Xxxx xxx context.getBean(Xxx…

ppt画思路图 流程图 医学药学生画图素材

关注微信&#xff0c;回复: 素材 &#xff0c;即可领取

EtherNET转Profibus网关使用 AB PLC的配置方法

兴达易控EtherNET转Profibus网关&#xff08;XD-EPPB20&#xff09;是一款功能强大的通讯设备&#xff0c;具备Profibus从站功能。它的主要作用是将EtherNET/IP设备无缝接入到PROFIBUS网络中。通过连接到Profibus总线&#xff0c;它可以作为从站使用&#xff0c;并且通过连接到…

作为8年老测试告诉你学会这样写性能测试方案,阿里p8都直呼内行

订单处理服务的性能测试方案V1.0 一、需求背景 在设计评审之后&#xff0c;开发在不知道服务性能瓶颈&#xff0c;需要测试协助定位服务的性能瓶颈&#xff0c;需要测试模拟一定时间之内设计并发用户同时向系统发出请求&#xff0c;检测出系统的响应能力&#xff0c;包括响应…

企业数字化建设之——老板关注的IT指标有哪些 ?

投资回报ROI | 商业价值 | 系统可用性 | 业务的参与程度 | 技术债务指数 降本&#xff0c;增效是IT部门工作的永恒话题 &#xff0c;降低成本 &#xff0c;增加效益 &#xff0c;降本增效的工作方向&#xff1a; 1 年初KPI目标、目标完成情况、关键证据、公司主线工作…

腾讯云2核4G和4核8G服务器配置5年租用价格表

腾讯云服务器网整理五年云服务器活动 txyfwq.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频…

Java的XWPFTemplate word生成列表

Java的XWPFTemplate工具类导出word.docx的使用_xwpftemplate 语法_youmdt的博客-CSDN博客 如果是表格的列表参考上面这篇文章即可&#xff0c;比较复杂的列表遍历暂时还没找到方法&#xff0c;只能手动创建表格了 上面是模板&#xff0c;非常简单&#xff0c;以为我们是要自己创…

SELF-AUGMENTED MULTI-MODAL FEATURE EMBEDDING

two embeddings f o r g _{org} org​ and f a u g _{aug} aug​ are combined using a gating mechanism 作者未提供代码

修改Conda虚拟环境默认位置失败——解决方案

修改虚拟环境默认安装位置依然❌ 偶然遇到conda创建虚拟环境创建失败的问题&#xff0c;按照教程修改.condarc文件中 envs_dirs:- E:\miniconda3\envs依然无法更改虚拟环境默认安装位置。 解决方案 找到想更改的虚拟环境文件位置&#xff0c;检查确认是否有写入权限&#…

C++ builder 常见问题汇总

1、CB静态编译设置 2、CB10.3设置经典编译器&#xff08;用于解决10.3弹出代码提示慢&#xff09; 3、CBuilder生成Release版本 &#xff1a; project->Options->CCompiler->Build Configuration 选择 Release project->Options->CLinker中取消Use dynamic RTL…

upload-labs关卡5(点和空格绕过)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第五关通关思路1.看源代码2.点和空格绕过3、验证上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测试&#xff0…

MES系统如何改进生产管理?

伴随机械制造业行业竞争逐渐加剧&#xff0c;越来越多企业意识到MES系统的重要性&#xff0c;慢慢积极主动把握和实施MES系统。可是纵观绝大部分企业或者MES生产商&#xff0c;对MES的掌握依然存在比较大的分歧。 有一些人说MES系统是企业信息化构建的中枢神经&#xff0c;也有…

HTML转PDF模板

一、准备pom依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>1.0.2</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId&g…

LockBit3.0的字符串解密方法

LockBit 与大多数勒索黑客团体一样以勒索软件即服务 (RaaS) 模式运行,该组织于 2019 年 9 月首次被观察到,此后发展为了今年最主要的勒索软件团伙,甚至超过了Conti、Hive等其他知名团体。据泄露数据站点的数据统计表明,LockBit占2022年第一季度所有与勒索软件相关的泄露事件…

基于自私羊群算法优化概率神经网络PNN的分类预测 - 附代码

基于自私羊群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于自私羊群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于自私羊群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于闪电搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…