C++ STL set用法详解

news2025/1/12 0:44:58

目录

1.set的创建。

具体例子:

set初始化:

2.set的特性。

3.set元素遍历:

迭代器创建:

4.set的基本函数。

4.1.insert()

4.2  clear()

4.3 find()

4.4 erase()

4.5  count()

4.6  size()

4.7 empty

4.8 lower_bound()

4.9 upper_bound()

附录:

1.迭代器:


我们都知道,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};
	//原来s
	printf("原来的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.coloradmin.cn/o/1361746.html

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

相关文章

NGUI基础-三大基础组件之Event System(Uicameras)

目录 主要作用 相关参数 (建议&#xff1a;红色是重点&#xff0c;黑色的了解即可&#xff09; Event Type Events go to Process Events in Event Mask​编辑 Debug Command Click Allow Multi Touch Auto Hide Cursor Sticky ToolTip/Long press ToolTip/ToolTip…

【漏洞挖掘】挖掘CNVD证书

文章目录 一、CNVD介绍事件型漏洞通用型漏洞 二、挖掘思路1. 黑盒测试资产搜集fofa API筛选脚本 2. 白盒测试代码审计 3. google hack注意事项 一、CNVD介绍 国家信息安全漏洞共享平台&#xff08;简称CNVD&#xff09;&#xff0c;对于白帽子来说&#xff0c;挖掘的漏洞提交后…

【Docker】创建,查看,进入容器

目录 方式一&#xff1a; 创建 查看 ​编辑 方式二&#xff1a; 创建 查看 进入容器 方式一&#xff1a; 首先查看有什么镜像 创建 docker run -i -t --namefreedom centos:7 /bin - i 表示容器一直运行着&#xff0c;容器如果没有客户端连接就会关闭&#xff0c;加了…

python中抓取小米应用商城xpath实例

页面源码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>手机游戏应用商店_软件商店app下载-小米应用商店</title> <…

nvidia-smi 完整查看显卡型号

当我们在使用nvidia-smi查看显卡的型号的时候&#xff0c;会发现出现如下问题&#xff1a; 可以看到我们此时无法看到显卡的准确型号&#xff0c;只能看到NVIDIA GeForce ... 解决方法&#xff1a;使用如下命令即可完整显示显卡型号 nvidia-smi -L 如下所示&#xff1a;

嵌入式代码经常产生bug的五大原因

在嵌入式开发软件中查找和消除潜在的错误是一项艰巨的任务。 通常需要英勇的努力和昂贵的工具才能从观察到的崩溃&#xff0c;死机或其他计划外的运行时行为追溯到根本原因。 在最坏的情况下&#xff0c;根本原因会破坏代码或数据&#xff0c;使系统看起来仍然可以正常工作或…

Transformer模型中前置Norm与后置Norm的区别

主要介绍原始Transformer和Vision Transformer中的Norm层不同位置的区别。 文章目录 前言 不同位置的作用 总结 前言 在讨论Transformer模型和Vision Transformer (ViT)模型中归一化层位置的不同&#xff0c;我们首先需要理解归一化层&#xff08;Normalization&#xff09;在…

java数据结构与算法刷题-----LeetCode63. 不同路径 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

Java HashMap 面试题(一)

HashMap 面试题&#xff08;一&#xff09; 文章目录 HashMap 面试题&#xff08;一&#xff09;3.3 面试题-说一下HashMap的实现原理&#xff1f;面试题-HashMap的put方法的具体流程hashMap常见属性源码分析 3.3 面试题-说一下HashMap的实现原理&#xff1f; HashMap的数据结…

Vue3-39-路由-导航异常的检测 afterEatch 与 编程式导航之后的订阅动作

说明 本文主要是介绍一下 路由的后置守卫 afterEatch 的一个重要的作用 &#xff1a; 就是检测路由异常信息。 它的实现方式是 通过第三个参数来返回的。 而且&#xff0c;它的异常检测是全局的。导航的异常有以下三种类型&#xff1a; aborted : 在导航守卫中 被拦截并返回了…

深入Pandas(二):高级数据处理技巧

文章目录 系列文章目录引言时间序列分析可视化示例 高级数据分析技术分组与聚合操作时间序列分析 高级数据操作数据合并与重塑示例&#xff1a;数据合并merge示例&#xff1a;数据合并concat示例&#xff1a;数据重塑 - 透视表 高级索引技巧 结论 系列文章目录 Python数据分析…

B059-权限管理系统01

目录 知识点介绍项目演示项目搭建动态菜单查询分析(权限表分析)权限系统表分析角色模块pageInfopageHelper实现前端动态分页高级查询新增与修改删除角色 分配权限-表分析角色授权数据-一级和二级权限查询 知识点介绍 项目演示 准备数据库 准备工程auth_new tips&#xff1a;…

Java中请求生成唯一追溯TraceId

Java中请求生成唯一追溯TraceId 一&#xff1a;背景 因为是微服务架构,平常日志太多,看日志不太好查,所以想要从一整个链路当中获取一个唯一标识,比较好定位问题&#xff0c; 原理就是从gateway网关将标识传递到下游,下游服务拿到这个标识,响应结束后将traceId反向写入响应体…

Python中的有序字典是什么

有序字典 一、简介 Python中的字典的特性&#xff1a;无序性。 有序字典和通常字典类似&#xff0c;只是它可以记录元素插入其中的顺序&#xff0c;而一般字典是会以任意的顺序迭代的。 二、普通字典 #! /usr/bin/env python3 # -*- coding:utf-8 -*- d1 {} d1[a] A d1[b…

十种编程语言的对比分析

在当今的软件开发领域&#xff0c;编程语言扮演着至关重要的角色。不同的编程语言各有其特点和适用场景&#xff0c;选择合适的编程语言能够提高开发效率和软件质量。本文将对十种常见的编程语言进行对比分析&#xff0c;帮助读者了解它们的优缺点和适用场景。 一、Python Pyt…

微服务实战系列之API加密

前言 随着一阵阵凛冽寒风的呼啸&#xff0c;新的年轮不知不觉滚滚而来。故事随着2023的远去&#xff0c;尘封于案底&#xff1b;希望迎着新年&#xff0c;绽放于枝头。在2024新岁启航&#xff0c;扬帆破浪之时&#xff0c;让烦恼抛洒于九霄&#xff0c;让生机蓬勃于朝朝暮暮。 …

Java 将Excel转换为TXT文本格式

TXT文件是一种非常简单、通用且易于处理的文本格式。在处理大规模数据时&#xff0c;将Excel转为TXT纯文本文件可以提高处理效率。此外&#xff0c;许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件&#xff0c;因此将Excel文件转换为TXT还可以简化数据导入过…

继续理解Nacos的CP和AP架构模型!

本篇文章延续文章“如何理解Nacos册CP和AP架构模型”&#xff0c;大家可以配套一起学习。 Nacos注册中心处理HTTP注册请求 在文章“如何理解Nacos册CP和AP架构模型”中已经提到过&#xff0c;Nacos注册中心用Restful API InstanceController的方法register()处理HTTP类型的注…

瑞数4——MmEwMD逆向分析

瑞数4——MmEwMD逆向分析 提示简介定位入口MmEwMD生成所需参数分析MmEwMD生成的大致流程第一部分生成(所需三个参数)第一部分生成的值赋值给另一个变量第二部分生成并与第一部分拼接最终的结果与MmEwMD拼接 第一部分生成的逆向分析&#xff08;所需参数&#xff1a;数组a、数字…

Linux第17步_安装SSH服务

secure shell protocol简称SSH。 目的&#xff1a;在进行数据传输之前&#xff0c;SSH先对联级数据包通过加密技术进行加密处理&#xff0c;然后再进行数据传输&#xff0c;确保数据传输安全。 1、在安装前&#xff0c;要检查虚拟机可以上网&#xff0c;否则可能会导致安装失…