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

个人主页:兜里有颗棉花糖💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【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;// 删除元素方式1auto pos = s.find(3);s.erase(pos);//s.erase(3); // 删除元素方式2for (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);elsecout << "没找到该元素" << 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;
elsecout << "未找到该元素" << 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;
elsecout << "集合中不存在该元素" << 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 100set<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.rhkb.cn/news/192134.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs+vue公益帮学网站的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。为确保中国经济的持续发展&#xff0c; 如何用方便快捷的方式使管理者在广阔的数据海洋里面查询、存储、管理和共享有效的数据信息&#xff0c;对我们的学习&#xff0c;工作和生活具有重要的现…

【python】Django——templates模板、静态文件、django模板语法、请求和响应

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 templates模板按app顺序寻找模板全局模板 静态文件jqueryBootstrap dja…

STM32中独立看门狗和窗口看门狗的使用方法

独立看门狗&#xff08;Independent Watchdog&#xff0c;IWDG&#xff09;和窗口看门狗&#xff08;Window Watchdog&#xff0c;WWDG&#xff09;是STM32微控制器中提供的两种看门狗定时器。看门狗定时器是一种硬件计时器&#xff0c;用于监视系统的运行状态&#xff0c;并在…

使用VScode编译betaflight固件--基于windows平台

使用VScode编译betaflight固件--基于windows平台 1、使用git克隆betaflight的开源代码2、betaflight的代码框架分析&#xff1a;3、配置编译环境&#xff1a;4、VScode上编译 betaflight不仅可以在LInux上进行编译也可以在Windows上编译&#xff0c;本文主要介绍在windows平台上…

【unity插件】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件

文章目录 前言地址描述Demo 演示Installation 安装如何玩演示用法使用示例完结 前言 一般的shader无法直接使用在UI上&#xff0c;需要在shader中定义特定的面板参数&#xff0c;今天就来推荐github上大佬做的一套开源的一系列UGUI&#xff0c;Shader实现的特效——UIEffect 为…

开源维修上门服务小程序SAAS系统源码 带完整搭建教程

在现代生活中&#xff0c;家电设备维修往往是一个耗时且繁琐的过程。消费者需要花费大量时间寻找合适的维修人员&#xff0c;并面临服务质量不稳定的风险。同时&#xff0c;对于维修人员来说&#xff0c;寻找客户和接收订单的过程也十分繁琐。因此&#xff0c;开发一款基于小程…

单片机与PLC的区别有哪些?

单片机与PLC的区别有哪些? 什么是单片机&#xff1f; 单片机&#xff08;Microcontroller&#xff0c;缩写MCU&#xff09;是一种集成了中央处理器&#xff08;CPU&#xff09;、存储器和输入/输出接口等功能模块的微型计算机系统。它通常被用于嵌入式系统和控制系统中&#x…

前端学习笔记--面试题系列总结

event loop它的执行顺序&#xff1a; 一开始整个脚本作为一个宏任务执行执行过程中同步代码直接执行&#xff0c;宏任务进入宏任务队列&#xff0c;微任务进入微任务队列当前宏任务执行完出队&#xff0c;检查微任务列表&#xff0c;有则依次执行&#xff0c;直到全部执行完执…

【kafka】 查看节点的消息

对于初学者来说&#xff0c;可能想去节点看看有没有消息产生和消费&#xff0c;可以去kafka的bin目录下执行这个命令&#xff1a; kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic myTopic --from-beginning 这个命令可以理解为&#xff1a;生产过的消…

8.指令格式,指令的寻址方式

目录 一. 指令格式 二. 扩展操作码 三. 指令寻址 &#xff08;1&#xff09;指令寻址 &#xff08;2&#xff09;数据寻址 1.直接寻址 2.间接寻址 3.寄存器寻址 4.寄存器间接寻址 5.隐含寻址 6.立即寻址 7.基址寻址 8.变址寻址 9.相对寻址 10.堆栈寻址 一. 指令…

Zabbix 5.0部署(centos7+server+MySQL+Apache)

环境 系统IPZABBIX版本主机名centos7192.168.231.2195.0zabbix-server 安装zabbix 我选择版本是zabbix-5.0 zabbix的官网是Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution 安装Zabbix软件源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/…

神经网络中的量化与蒸馏

本文将深入研究深度学习中精简模型的技术&#xff1a;量化和蒸馏 深度学习模型&#xff0c;特别是那些具有大量参数的模型&#xff0c;在资源受限环境中的部署几乎是不可能的。所以就出现了两种流行的技术&#xff0c;量化和蒸馏&#xff0c;它们都是可以使模型更加轻量级&…

MySQL8 绿色版安装

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; MySQL学习 ✨特色专栏&#xff1a; My…

Selenium浏览器自动化测试框架简单介绍

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google …

ARM Linux 基础学习 / 系统相关,文件系统,文件属性

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料&#xff08;如 百问网的《嵌入式Linux应用开发完全手册》&#xff0c;在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO&#xff1a;开发板资料》或《2.2 全系列Linux教程&#xf…

MAT工具定位分析Java堆内存泄漏问题方法

原创/朱季谦 一、MAT概述与安装 MAT&#xff0c;全称Memory Analysis Tools&#xff0c;是一款分析Java堆内存的工具&#xff0c;可以快速定位到堆内泄漏问题。该工具提供了两种使用方式&#xff0c;一种是插件版&#xff0c;可以安装到Eclipse使用&#xff0c;另一种是独立版…

STM32——STM32F4系统架构

文章目录 前言STM32F4XX系统架构 前言 本篇文章为STM32F4系列的系统架构&#xff0c;因为最近在学习F4的板子&#xff0c;暂时先更F4的&#xff0c;有需要F1的后续再更新。 主系统由 32 位多层 AHB 总线矩阵构成&#xff0c;可实现以下部分的互连&#xff1a; STM32F4XX系统架…

Latex在图表标题里面引用参考文献时,出现参考文献顺序混乱的解决方案(适用于bibtex)

问题描述 如果你在figure环境的\caption或\captionof中使用\cite&#xff0c;但是参考文献的顺序仍然不正确&#xff0c;可能是因为LaTeX的处理流程导致了这个问题。 比如图片在第二章节但里面引用了参考文献&#xff0c;在文章末尾的参考文献第二章图片的参考文献顺序&#…

代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和

LeetCode T1143 最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 动规五部曲分析 1.确定dp数组的含义 这里dp数组的含义是结尾分别为i-1,j-1的text1和text2的最长公共子序列长度 至于为什么是i-1,j-1我之前已经说过了,这里再…

kafka+ubuntu20.04+docker配置

记录一次配置过程 安装docker 参加下面链接的第一部分 Ubuntu20.04使用docker安装kafka服务-CSDN博客 安装zookeeper docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper安装kafka服务 docker run -d --name kafka …