C++ STL set用法详解

我们都知道,set是STL里的一种数据结构,这篇博客就是set用法的详解。

1.set的创建。

set初始化一般是

set<数据结构名称> 名字;

具体例子:

创建一个int型,名称是s的set。

set<int> s;

set还可以创建STL里的数据结构(包括自己)

set<pair<int,int>> s;set<set<int>> s;

set初始化:

再创建时,可以对set进行初始化。

set<int> s={1,3,6,4};

这样就给s的初始化成{1,3,6,4} 

2.set的特性。

set特性有两点:

  1. 会自动排序。
  2. 会自动去重。
  3. 底层使用红黑树实现

3.set元素遍历:

set不能用下标访问,只能用迭代器访问。

迭代器创建:

例如创造set<int> 的迭代器:

set<int>::iterator it;

这样就成功的创建了set<int> 的迭代器,名子是it。 

遍历set<int> s;的所有元素:

for(it=s.begin();it!=s.end();it++)
{}

用*it来访问当前的元素。

示例:

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,4};set<int>::iterator it;for(it=s.begin();it!=s.end();it++){cout<<*it<<' ';}return 0;
}

结果如下:

如果你很懒,那么还有一种方式很适合你:

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,4};for(auto it:s){cout<<it;}return 0;
}

注意:这里是用it,不是*it。

结果如下 :

当题目卡常时:不建议用auto,用迭代器。 

4.set的基本函数。

这里会讲:insert(),clear(),find(),erase(),count(),size(),empty(),lower_bound(),upper_bound()。

4.1.insert()

先来看一下STL底层的实现。

看不懂没关系,那不是重点。

s.insert(x)代表再s的末尾添加一个x。

复杂度:O(\log_2^N) 

示例代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,4};s.insert(9);for(auto it:s){cout<<it;}return 0;
}

结果:

注:insert有很多种形式,由于博主太菜,不会,就分享这一种。

4.2  clear()

老规矩,底层实现:

这个函数用法很简单:清空一个set的所有元素。

s.clear()清空s里所有元素。

示例:

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,4};s.insert(9);printf("s清空前:\n");for(auto it:s){printf("%d ",it);}printf("\n");s.clear();printf("s清空后:\n");for(auto it:s){printf("%d ",it);}return 0;
}

执行结果:

由图发现,清空后s啥都没有了。

复杂度:O(N)N为元素个数。

4.3 find()

这个函数不太推荐使用,可以用之后的count更方便。

底层实现:

find(x) 如果找到了,返回迭代器,找不到返回s.end()

也可以这么理解:find(x) 找到了返回x的迭代器,找不到返回数组元素个数迭代器

具体用法:

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,4};s.insert(9);//此时s = {1,2,3,4,9};//找到:set<int>::iterator it = s.find(9);cout<<"找到了:"<<*it<<'\n';//找不到:it = s.find(222);cout<<"没找到:"<<*it;return 0;
}

运行结果:

可以和if else 配合:

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,4};s.insert(9);//此时s = {1,2,3,4,9};if(s.find(5)==s.end()){cout<<"没找到";}else{cout<<"找到了";}return 0;
}

复杂度:O(\log_2^N) 

4.4 erase()

底层实现:

s.erase(x)是从s种删除x这个元素。

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,5};//原来sprintf("原来的s:\n");for(auto it:s){cout<<it<<' ';}printf("\n");s.erase(3);//删除printf("删除3后的s:\n");for(auto it:s){cout<<it<<' ';}return 0;
}

结果如下:

复杂度:O(N)

4.5  count()

这个函数可以代替find函数。

底层实现:

count(x) 可以返回set中x元素出现的次数,由于set自动去重,所以只返回(0/1)

有出现:1

没出现:0

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,6};//此时s = {1,2,3,6};if(s.count(4) == 0){cout<<"没找到";}else{cout<<"找到了";}return 0;
}

4没有出现,是没找到。

 复杂度:O(1)

4.6  size()

这个...不需多讲,就是返回set中元素个数。

底层实现:

具体用法:

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,6};//此时s = {1,2,3,6};cout<<s.size();return 0;
}

复杂度:O(1) 

4.7 empty

这个比size还简单,如果set非空,那么返回0,否则返回1。

底层实现:

复杂度:O(1) 

4.8 lower_bound()

lower_bound(x)

这个是找到set中第一个>=x的迭代器。不存在则返回end()

底层实现:

代码示例:

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,6};//此时s = {1,2,3,6};set<int>::iterator it = s.lower_bound(4);cout<<*it;return 0;
}

第一个>=4的,是6

结果:

复杂度:O(\log_2^N)  

4.9 upper_bound()

和lower_bound()很像,但是upper_bound是返回第一个>x的迭代器,不存在则返回end()

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,6};//此时s = {1,2,3,6};set<int>::iterator it = s.upper_bound(3);cout<<*it;return 0;
}

结果:

复杂度:O(\log_2^N) 

好,函数部分到此结束。

附录:

1.迭代器:

你可以将迭代器理解成指针。

当你想反向遍历set时,要用到rbegin和rend。

#include<bits/stdc++.h>
using namespace std;
int main()
{set<int> s={1,2,3,6};//此时s = {1,2,3,6};set<int>::reverse_iterator it;//反向迭代器for(it=s.rbegin();it!=s.rend();it++)//注意啊!!!这里还是用it++{cout<<*it<<' ';}return 0;
}

结果:


set各种迭代器区别:

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

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

相关文章

创建express服务器的快捷方式

第一步&#xff1a;打开cmd&#xff08;创建服务器的目录&#xff09;&#xff1b;创建 express 名字 第二步&#xff1a;cd 名字进入 第三步&#xff1a;下载一个npm i 第四步&#xff1a;在文件下接口那里输入nodemon/npm start 启动 条件查询&#xff1a;$gt $lt $gte…

Element-ui自定义input框非空校验

1、vue自定义非空指令&#xff1a; main.js中自定义非空指令 当input框或下拉框中数据更新时&#xff0c;触发校验 Vue.directive(isEmpty,{update:function(el,binding,vnode){if(vnode.componentInstance.value""){el.classList.add("is-required");}e…

2024更新腾讯云轻量应用服务器优惠价格表和CVM优惠活动

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

LVDS接口ADC数据处理流程案例参考

一ADC&#xff1a; 16bit精度DDRLVDS8个outpin 二&#xff1a;FPGA处理流程&#xff1a; 1.差分数据转单端idelaye2generate for generate for(i0;i<7;ii1)begin:GEN_IN IBUFDS #(.DIFF_TERM("TRUE"), // Differential Termination.IBUF_LOW_PWR("F…

分布式【zookeeper面试题12连问】

1. 面试官&#xff1a;工作中使用过Zookeeper嘛&#xff1f;你知道它是什么&#xff0c;有什么用途呢&#xff1f; 「小菜鸡的我&#xff1a;」 有使用过的&#xff0c;使用ZooKeeper作为**「dubbo的注册中心」&#xff0c;使用ZooKeeper实现「分布式锁」**。ZooKeeper&#…

k8s中实现pod自动扩缩容

一、k8s应用自动扩缩容概述 1&#xff09;背景&#xff1a; 在实际的业务场景中&#xff0c;我们经常会遇到某个服务需要扩容的场景&#xff08;例如&#xff1a;测试对服务压测、电商平台秒杀、大促活动、或由于资源紧张、工作负载降低等都需要对服务实例数进行扩缩容操作&…

openCV处理音视频的常用API及一般流程

OpenCV是一个功能强大的开源计算机视觉库&#xff0c;提供了丰富的API和函数&#xff0c;用于图像处理、特征提取、目标检测等任务。下面是一些常用的OpenCV API及其在C中的使用方法&#xff1a; 1. 图像读取和显示&#xff1a; #include <opencv2/opencv.hpp>int ma…

【PostgreSQL】约束-主键

【PostgreSQL】约束链接 检查 唯一 主键 外键 排他 主键 主键&#xff08;Primary Key&#xff09;是数据库表中用于唯一标识每一行记录的字段。主键具有以下特点&#xff1a; 唯一性&#xff1a;每个主键值在表中是唯一的&#xff0c;不允许出现重复值。非空性&#xff1a…

vue3(十三)-基础入门之路由配置与重定向

一、一级路由与重定向 1、创建 App.vue 在父组件中导入子组件 Navbar <template><div><navbar></navbar></div> </template><style lang"scss"></style><script> import navbar from /components/Navbarex…

arm64 UAO/PAN 特性对用户空间边界读写的影响(copy_from/to_user)

文章目录 1 UAO/PAN 特性由来2 硬件PAN的支持3 UAO 的支持 1 UAO/PAN 特性由来 linux 内核空间与用户空间通过 copy_from/to_user 进行数据拷贝交换&#xff0c;而不是通过简单的 memcpy/strcpy 进行拷贝复制&#xff0c;原因是安全问题&#xff08;这里不详细展开&#xff09…

初始化数组方法大全

初始化数组方法大全 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同深入研究在编程中常用的操作之一——数组的初始化。数组是许多编程语…

pytest --collectonly 收集测试案例

pytest --collectonly 是一条命令行指令&#xff0c;用于在运行 pytest 测试时仅收集测试项而不执行它们。它会显示出所有可用的测试项列表&#xff0c;包括测试模块、测试类和测试函数&#xff0c;但不会执行任何实际的测试代码。 这个命令对于查看项目中的测试结构和确保所有…

C++的基础语句

C前奏 1.变量的定义2.键入和输出3.运算符4.sizeof()函数5.判断6.goto语句7.总结 这个专题&#xff0c;我会用简单的语言介绍C的语法&#xff0c;并会适当的对比实现相同或相似功能的C与python代码写法上的不同。 1.变量的定义 对于python来说&#xff0c;我们可以跳过定义直接…

定岗定编设计:企业职能部门定岗定编设计项目成功案例

一、客户背景及现状分析 某大型车辆公司隶属于某央企集团&#xff0c;建于20世纪60年代&#xff0c;是中国高速、重载、专用铁路车辆生产经营的优势企业&#xff0c;轨道车辆制动机研发制造的主导企业&#xff0c;是隶属于国内最大的轨道交通设备制造上市企业的骨干二级公司。公…

AI绘图软件,科技之旅绘画

科技与艺术的碰撞总能产生令人惊叹的火花&#xff0c;现在小编要给大家介绍一款引领未来艺术潮流的AI绘图软件——首助编辑高手。这是一款将人工智能与创意绘画完美结合的软件&#xff0c;它将为你打开一扇全新的创意之门。 所需工具&#xff1a; 一个【首助编辑高手】软件 …

Qt第一个UI程序设计

在第一个Qt程序的基础上我对ui界面进行设计&#xff0c;点击设计按钮 然后 拖动Label按钮输入想要输入的语句。 运行结果如下图。

通过用户输入数字,并计算二次方程

通过用户输入数字&#xff0c;并计算二次方程 以下实例为通过用户输入数字&#xff0c;并计算二次方程&#xff1a; 实例(Python 3.0) # Filename : test.py # author by : www.dida100.com# 二次方程式 ax**2 bx c 0 # a、b、c 用户提供&#xff0c;为实数&#xff0c;a…

案例1—综合项目组网(2)

交换机连接服务器&#xff1a; 服务器虚拟化&#xff1a; 1. 为什么要用虚拟化技术 2. 虚拟化和NFV的区别 3. 将8台服务器虚拟化为一个资源池的大致步骤 4. 服务器规划情况&#xff1a;管理网和业务网 交换机连接服务器&#xff1a; 1&#xff09;将交换机和服务器相连&am…

算法巡练day03Leetcode203移除链表元素707设计链表206反转链表

今日学习的文章视频链接 https://www.bilibili.com/video/BV1nB4y1i7eL/?vd_source8272bd48fee17396a4a1746c256ab0ae https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 链表理论基础 见我的博…

计算机组成原理 主存和CPU连接与主存提速方案

文章目录 主存与CPU的连接译码器线选法译码片选法总结 位拓展字拓展字位同时拓展 主存提速方案存储周期双端口RAM多模块存储器单体多字存储器多模块多体并行存储器存储器高位交叉编址低位交叉编址 主存与CPU的连接 #mermaid-svg-3wv6WzRP2BvKEHQZ {font-family:"trebuchet…