【C++ 容器 set】set的相关用法

图片名称

博主首页: 有趣的中国人

专栏首页: C++进阶

其它专栏: C++初阶 | 初阶数据结构 | Linux

博主会持续更新

    本篇文章主要讲解 C++容器set的相关用法 的相关内容

    文章目录

    • 1. 关联式容器
    • 2. 树形结构的关联式容器
    • 3. set的介绍以及相关使用操作
      • 3.1 set的介绍
      • 3.2 set的相关使用操作
        • `set的模板参数列表`
        • `set的功能`
        • `set的构造函数`
        • `set的删除`
        • `set的查找`
        • `lower_bound和upper_bound`


      1. 关联式容器


      我已经在之前介绍过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。

      关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>(上一篇文章讲过)结构的键值对,在数据检索时比序列式容器效率更高。


        2. 树形结构的关联式容器


        根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。首先来看一下set


          3. set的介绍以及相关使用操作

          3.1 set的介绍


          链接:set介绍

          1. 唯一性: std::set 中的元素是唯一的,即集合中不允许重复元素。

          2. 排序: std::set 会根据元素的值自动进行排序,默认情况下,它使用元素类型的比较函数来实现排序。

          3. 内部实现: std::set 使用红黑树作为底层数据结构来实现,这使得它的插入、删除和查找操作的时间复杂度都是 O(log n)

          4. 使用方法: 要使用 std::set,首先需要包含 <set> 头文件。然后,你可以声明一个 std::set 对象,并使用Insert() 方法向其中插入元素。你还可以使用 erase() 方法来删除元素,使用 find() 方法来查找元素,以及使用size() 方法获取集合的大小。

          5. 迭代器: std::set 支持迭代器,你可以使用迭代器遍历集合中的元素,并对其进行操作。

          6. 自定义排序: 如果你想要按照自定义的方式对元素进行排序,可以提供自定义的比较函数作为 std::set 的模板参数之一。

          3.2 set的相关使用操作

          set的模板参数列表

          在这里插入图片描述

          • : set中存放元素的类型,实际在底层存储<value, value>的键值对。
          • Compare:set中元素默认按照小于来比较
          • Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

          set的功能

          • set可以帮你完成去重+排序,例如:
          void settest1()
          {
          	set<int> s1;
          	s1.insert(1);
          	s1.insert(11);
          	s1.insert(3);
          	s1.insert(1);
          	s1.insert(4);
          	s1.insert(2);
          
          	for (auto e : s1)
          	{
          		cout << e << " ";
          	}
          }
          

          在这里插入图片描述

          set的构造函数

          在这里插入图片描述

          • 迭代器区间构造:
          void settest1()
          {
          	vector<int> v = { 3,2,8,1,10,2 };
          	set<int> s2(v.begin(), v.end());
          	for (auto e : s2)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          }
          

          在这里插入图片描述

          • Initializer_list构造:
          void settest1()
          {
          	set<int> s3 = { 3,2,8,1,10,2 };
          	for (auto e : s3)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          }
          

          set的删除

          在这里插入图片描述

          void settest1()
          {
          	set<int> s3 = { 3,2,8,1,10,2 };
          	for (auto e : s3)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          	s3.erase(8);
          	s3.erase(18);
          	for (auto e : s3)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          }
          

          在这里插入图片描述

          set的查找

          在这里插入图片描述

          void settest1()
          {
          	set<int> s3 = { 3,2,8,1,10,2 };
          	for (auto e : s3)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          	s3.erase(8);
          	s3.erase(18);
          	for (auto e : s3)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          
          
          	auto pos = s3.find(10);
          	if (pos != s3.end())
          	{
          		cout << *pos << endl;
          		s3.erase(pos);
          	}
          	else
          	{
          		cout << "找不到" << endl;
          	}
          	for (auto e : s3)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          }
          

          在这里插入图片描述

          lower_bound和upper_bound

          在这里插入图片描述
          在这里插入图片描述

          • lower_bound>= x 的值,返回第一个 >= x 的值的位置
          • upeer_bound>x 的值,返回第一个 >x 的值的下一个位置
          void settest2()
          {
          	std::set<int> myset;
          	for (int i = 1; i < 10; i++)
          		myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90
          
          	for (auto e : myset)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          
          	auto itlow = myset.lower_bound(25);                // >= x
          	auto itup = myset.upper_bound(60);                 // > x
          
          	// [30, 70)
          	myset.erase(itlow, itup);                     // 10 20 70 80 90
          
          	for (auto e : myset)
          	{
          		cout << e << " ";
          	}
          	cout << endl;
          }
          

          在这里插入图片描述

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

          如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

          相关文章

          Linux内核驱动开发-001字符设备开发-003独立按键杂项驱动

          1驱动程序 /*************************************************************************> File Name: key_misc.c> Author: yas> Mail: rage_yashotmail.com> Created Time: 2024年04月22日 星期一 17时20分42秒**********************************************…

          不同语言在算法使用方面的差异(Java 、C++篇)

          由于我认为的会了是能得到结果了&#xff0c;所以我亲自去把题解的C代码给改成了Java的&#xff0c;尽管代码和逻辑上的高度统一。编译器还是报错了。 第三个死都过不去。而且后面的还超时了。 这使我十分怀疑是不是超时或者空间不够所导致的。但是去问讯飞星火&#xff0c;它…

          PhotosCollage for Mac:优雅且实用的照片拼贴软件

          PhotosCollage for Mac是一款优雅且实用的照片拼贴软件&#xff0c;为Mac用户提供了一个便捷、高效的平台&#xff0c;以创建精美、个性化的照片拼贴作品。 PhotosCollage for Mac v1.4.1激活版下载 该软件界面简洁直观&#xff0c;操作便捷。用户只需将想要拼贴的照片拖入“照…

          社交媒体数据恢复:Singal

          Signal 数据恢复方法 Signal 是一款主打安全的即时通信应用&#xff0c;它采用了端到端加密的聊天方式。然而&#xff0c;有时候用户可能会遇到数据丢失的问题&#xff0c;例如不小心删除了重要的聊天记录或者忘记了 PIN 码导致无法访问账户数据。以下是针对 Signal 数据恢复的…

          花生壳域名收费?那就用免费的dnsexit动态域名解析保姆级图文教程,效果杠杠的

          免费dnsexit动态域名解析教程 在互联网上有很多不同的域名解析服务&#xff0c;其中dnsexit是一个流行的免费动态域名解析服务&#xff0c;它允许用户动态更新其IP地址&#xff0c;确保域名始终指向正确的服务器。以下是一个dnsexit动态域名解析的图文教程&#xff0c;帮助你了…

          区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(三)

          &#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading VII 讨论&#xff1a;关于匿名性与市场平台的困境 在本文的这一部分&#xff0c;我们将讨论关于隐藏 NFT 所有者地址的困境&#xff0c;以及为什么像 OpenSea 这样的 NFT 市场平台几乎必须得到完全的信…

          Python-VBA函数之旅-min函数

          目录 一、min函数的常见应用场景 二、min函数使用注意事项 三、如何用好min函数&#xff1f; 1、min函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、min函数的常见应用场景 mi…

          vue跟jQuery中的事件冒泡、事件捕获、事件委托(事件代理)

          1、事件捕获、事件冒泡 在JS中&#xff0c;我们管事件发生的顺序叫“事件流” 标准的事件流&#xff1a;当dom触发了事件后&#xff0c;会先通过事件传播捕获到目标元素&#xff0c;然后目标节点通过事件传播实现事件冒泡 事件传播&#xff1a;无论是捕获还是冒泡&#xff0…

          百面算法工程师 | 池化相关总结

          目录 14.1 什么是池化 14.2 池化层的作用 14.3 平均池化 14.4 最大池化 14.5 空间金字塔池化 14.6 ROI Pooling 14.7 最大池化与平均池化是如何进行反向传播的 14.8 卷积层与池化层的区别 欢迎大家订阅我的专栏一起学习共同进步 祝大家早日拿到offer&#xff01; lets…

          位运算、状态压缩、枚举子集汇总

          本文涉及知识点 证明容斥原理和证明集合枚举都用到了&#xff1a;二项式定理 【数学归纳法 组合数学】容斥原理 基础知识 位运算优先级 位运算的结合性都是从左到右。优先级低的先运算。 优先级位运算符说明7<< >>位左移/位右移10&按位与11^按位异或12按位…

          织梦云端:网络信号原理的艺术解码

          hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《织梦云端&#xff1a;网络信号原理的艺术解码》&#xff0c;在这篇文章中&#xff0c;你将会学习到网络信号原理以及应用&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图…

          【树莓派】yolov5 Lite,目标检测,行人检测入侵报警,摄像头绑定

          延续之前的程序&#xff1a; https://qq742971636.blog.csdn.net/article/details/138172400 文章目录 播放声音pygame不出声音怎么办&#xff08;调节音量&#xff09;树莓派上的音乐播放器&#xff08;可选&#xff09;命令行直接放歌&#xff08;尝试放mp3歌曲&#xff09; …

          数据结构-二叉搜索树(BST)

          目录 什么是二叉搜索树 二叉搜索树的特性 (1)顺序性 (2)局限性 二叉搜索树的应用 二叉搜索树的操作 (1)查找节点 (2)插入节点 (3)删除节点 (4)中序遍历 什么是二叉搜索树 如图所示&#xff0c;二叉搜索树&#xff08;binary search tree&#xff09;满足以下条件。…

          【Vivado那些事儿】使用 Python 提取 ILA 数据

          ILA应该是调试AMD-Xilinx FPGA最常用的IP。 在调试中&#xff0c;我们希望 ILA 中的波形可以提供有关设计问题的所有信息&#xff0c;但情况并非如此。对于复杂的调试&#xff0c;我们还需要将 ILA 捕获的真实数据存储到可以进一步处理的文件中。根据放置 ILA 的位置&#xff0…

          C语言阶段的题目解析

          前言 我们C语言已经学习的差不多了&#xff0c;但是C语言之中存在的一些问题与难点我们还不一定能够又快又好地解决&#xff0c;为了夯实我们的基础&#xff0c;我们来练习几道稍微有点难度的C语言习题吧 例题一 题目 int main(void) {unsigned char i 7;int j 0;for (; i…

          【PyTorch 实战3:YOLOv5检测模型】10min揭秘 YOLOv5 检测网络架构、工作原理以及pytorch代码实现(附代码实现!)

          YOLOv5简介 YOLOv5&#xff08;You Only Look Once, Version 5&#xff09;是一种先进的目标检测模型&#xff0c;是YOLO系列的最新版本&#xff0c;由Ultralytics公司开发。该模型利用深度学习技术&#xff0c;能够在图像或视频中实时准确地检测出多个对象的位置及其类别&…

          千锤百炼之每日算法(三)

          题外话 不会再水了,先把算法任务完成! 正题 第一题 简写单词 规定一种对于复合词的简写方式为只保留每个组成单词的首字母,并将首字母大写后再连接在一起 比如“College English Test"可以简写成“CET",“Computer Science 可以简写为"CS"&#xff0c;I a…

          【深度学习】【Lora训练1】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

          文章目录 一、环境搭建指南二、个性化安装流程三、启动应用四、打开web五、开始训练 19.27服务器 一、环境搭建指南 打造一个高效且友好的开发环境&#xff1a; 项目源码获取&#xff1a; 通过以下命令轻松克隆项目及所有子模块至您的Linux系统&#xff1a; git clone --recu…

          《ElementUI 基础知识》el-tabs header 监听鼠标中键滚动时左右滑动(ElementPlus同样适用)

          前言 收到需求&#xff0c;可监听 el-tabs 头在鼠标 hover 时。滑动鼠标中键&#xff0c;可左右滑动&#xff01; 效果 鼠标中键上下滑动时&#xff1b;向上滑&#xff0c;向左移动&#xff1b;向下滑&#xff0c;向右移动&#xff1b; 实现 代码56 - 60行&#xff0c;添加…

          寝室快修|基于SprinBoot+vue的贵工程寝室快修小程序(源码+数据库+文档)

          贵工程寝室快修目录 目录 基于SprinBootvue的贵工程寝室快修小程序 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 在线报修管理 3公告信息管理 4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&a…