C++——STL标准模板库——容器详解——set
一、基本概念
set容器是一种具备自动排序功能的集合,默认递增排序;元素无法直接修改,且不能重复;另一个版本叫做multiset,允许存在重复元素,其他功能和性质一样。
set容器底层结构一般为自平衡二叉搜索树,能够保证在O(logn)时间复杂度内完成删除、搜索、插入等操作。
set容器提供常量双向迭代器,不支持随机访问,不允许修改现有元素
二、构造函数
1、set<T>s; 默认构造函数
2、set<T>s={initializer _list} 初始化列表构造
3、set<T>s(set<T>& other); 复制构造函数
4、set<T>s(set<T>&& other); 移动构造函数
5、set<T>s(iterator first,iterator last); 迭代器范围构造
6、set<T,Key_Compare>s 指定排序方式的构造函数,当构造自定义类型的容器时,必须指定排序方式。Key_Compare是一个指定排序方式的自定义类型,一般为类或者结构体,封装了定义排序方式的仿函数。例如指定递减排序:
class MyCompare {
public:bool operator()(const int&a, const int&b)const {return a > b;}
};set<int,MyCompare> s;
在例子中模板参数列表中显式指定排序类型时,实例化对象参数可省略。
set容器和前面其他容器一样,都重载了多种构造方式,可根据实际情况有选择使用。
三、成员函数
(一)迭代器函数
1、set<T>::iterator begin(); 返回指向容器首元素的迭代器
2、set<T>::iterator end(); 返回指向容器尾元素后面一个未知的迭代器
set容器提供的迭代器是双向迭代器,不支持随机访问。当然set也包括反向版本rbegin()、rend(),常量迭代器cbegin()、cend()等。
set容器提供的迭代器本质上都是常量迭代器,所以set容器不允许修改当前元素。
(二)大小相关函数
1、bool set<T>::empty(); 判断容器是否为空
2、size_t set<T>::size(); 返回容器当前元素个数
3、size_t set<T>::max_size(); 返回set容器能够容纳元素的最大值
set容器没有容量的概念
(三)插入函数
STL源码中存在两种返回值的insert()函数,例:
1、iterator insert(T&value);
2、Pair insert(T&value);
第二个版本的返回类型Pair为一个组合类型,包含<iterator,bool>两个结果,这种组合类型叫做对组;bool类型判断是否插入成功,iterator类型指向插入位置的迭代器,如果插入不成功指向end()。STL中通过条件编译实现了:set容器调用版本2,multiset容器调用版本1,从而实现了set容器元素唯一,multiset容器元素可重复。
insert();函数重载了以下几种插入方式。
1、insert(iterator pos,T&value); 迭代器指定插入位置,复制插入元素
2、insert(iterator pos,T&&value); 迭代器指定插入位置,移动插入元素
3、insert(iterator first,iterator last); 插入区间内的元素
4、insert(initializer _list); 插入初始化列表
5、emplace(T&&value); 在容器内直接构造变量,较insert更高效
(四)删除函数
1、size_t erase(const T&value); 删除指定值,set返回1,multiset返回删除个数
2、iterator erase(iterator pos); 删除指定位置的值,返回指向该位置迭代器
3、iterator erase(iterator first,iterator last);删除指定区间,返回last
4、void set<T>::clear(); 清除容器所有内容
(五)查找函数
1、iterator set<T>::find(value); 查找给定值,返回迭代器
2、size_t set<T>::count(value); 返回容器中给定值的数量,set容器一般返回1或0
3、iterator set<T>::lower_bound(value); 返回第一个小于给定值的元素出现位置的迭代器
4、iterator set<T>::upper_bound(value); 返回第一个大于给定值的元素出现位置的迭代器
5、pair<first,last> set<T>::eque_range(value); 返回容器中给定值中间的区间(前闭后开)
(六)交换函数
1、void set<T>::swap(set<T>& other); 交换两个set容器的内容
四、使用注意事项
(一)优势:
- 自动排序:
std::set中的元素自动根据其值进行排序。你不需要像使用数组或链表那样手动排序。 - 唯一性:
std::set只存储唯一的元素,这样可以确保数据的一致性,不会出现重复的数据。 - 高效的查找操作:由于
std::set实现为红黑树,其查找、插入和删除操作的平均时间复杂度为 O(log n)。 - 标准容器:
std::set是 C++ 标准库的一部分,因此与其它标准库组件有良好的兼容性。
(二)劣势:
- 值的不可变性:一旦将一个元素插入到
std::set中,你就不能更改该元素的值。如果你需要修改一个元素的值,你需要先删除旧的元素,然后插入新的元素。 - 内存使用:由于
std::set需要为每个元素分配内存并维护一棵红黑树,所以它的内存使用可能会比其它容器(如数组或向量)更高。
(三)使用时需要注意的事项:
- 元素的唯一性:由于
std::set存储唯一的元素,如果你尝试插入一个已经存在的元素,std::set将不会做任何事情,即不会插入重复的元素。因此,在插入元素之前,你可能需要检查元素是否已经存在于 set 中。 - 迭代器的稳定性:
std::set的迭代器在删除元素后可能会失效。如果你在迭代过程中删除元素,可能会导致未定义的行为。为了安全地删除元素,你可以先保存要删除元素的迭代器,然后在迭代完成后再进行删除。 - 与其它容器的交互:当与其它容器(如
std::vector或std::list)进行交互时,需要注意std::set的特性。例如,将一个元素从一个 set 移动到另一个 set 或从 set 移动到另一个容器时,需要特别小心。 - 自定义比较函数:
std::set需要一个比较函数来确定元素的排序和唯一性。确保你提供的比较函数是正确的,并且对于所有可能的输入都能产生一致的结果。
(四)迭代器迭代过程删除元素实例
#include <iostream>
#include <set> int main() { std::set<int> my_set = {1, 2, 3, 4, 5}; for (auto it = my_set.begin(); it != my_set.end(); ) { if (*it == 3) { it = my_set.erase(it); // 保存迭代器并删除元素 } else { ++it; // 继续迭代 } } // 输出 set 中的元素 for (const auto& elem : my_set) { std::cout << elem << " "; } std::cout << std::endl; return 0;
}
相关文章:
C++——STL标准模板库——容器详解——set
一、基本概念 set容器是一种具备自动排序功能的集合,默认递增排序;元素无法直接修改,且不能重复;另一个版本叫做multiset,允许存在重复元素,其他功能和性质一样。 set容器底层结构一般为自平衡二叉搜索树…...
Vim一键配置指南,打造高效率C++开发环境
文章目录 前言安装与卸载功能演示gcc/g升级问题 前言 Vim作为当下最受欢迎的文本编译器之一,不仅具有强大的文本编辑功能,还提供了高度的可定制性。用户可以根据自己的喜好自定义配置,并且通过自己编写插件或者使用现有的插件来扩展Vim的功能…...
新航向,新生态: Michael在出海业务圆桌会议分享HyperBDR全球业务拓展之道
1月15日-16日,以“领航新开局,共赢新生态”为主题的华为云生态大会2024在华为云贵安数据中心云上屯盛大举行。本次会议聚焦于华为云全国生态伙伴与开发者,旨在共同见证华为云生态战略的最新进展和伙伴政策的新升级。与会者将分享来自优秀生态…...
SpringBoot异步处理
Spring boot异步处理 业务场景: 如执行数据库备份任务,前端发起请求到后端,后端备份数据库的处理逻辑需要很长一段时间,此时前端会一直等待后端返回结果,给用户给等待时间过长,这是就要考虑异步处理了&…...
2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块二
竞赛需要完成三个阶段的任务,分别完成三个模块,总分共计 1000分。三个模块内容和分值分别是: 1.第一阶段:模块一 网络平台搭建与设备安全防护(180 分钟,300 分)。 2.第二阶段:模块二…...
matplotlib绘制动态瀑布图
绘制瀑布图思路:遍历指定文件目录下所有的csv文件,每读一个文件,取文件前20行数据进行保存,如果超过规定的行数300行,将最旧的数据删除,仅保留300行数据进行展示。 网上找的大部分绘制瀑布图的代码&#x…...
【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)
00. 目录 文章目录 00. 目录01. 串口简介02. 串口收发HEX数据包接线图03. 串口收发HEX数据包示例104. 串口收发HEX数据包示例205. 串口收发文本数据包接线图06. 串口收发文本数据包示例07. 程序示例下载08. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常…...
uniapp列表实现方式 v-for
创建列表视图 v-for v-for“对象item in 数组” v-for“(对象item,下标) in 数组” v-for“(对象item,使用这个键取到的值,下标) in 数组” :key 绑定标识 一般建议使用对象中的id等值 类型 any <template><view><view clas…...
SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解
SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤 三、使用Core API访问与操作数据库 Sqlalchemy 的Core部分集成了DB API, 事务管理,schema描述等功能,ORM构筑于其上。本章介绍创建 Engine对象,使用基本的…...
PDF有编辑密码怎么办
目录 注意: windows方法: 1 python 下载 2 打开命令行 3 安装 pikepdf 4 编写python脚本 5 使用py脚本 6解密完成 Linux方法: 注意: 此方法可以用于破解PDF的编辑密码,而不是PDF的打开密码 当遇到类似如下问…...
智慧公厕:打造智慧城市公共厕所信息化管理的新升级
在现代社会中,随着科学技术的不断进步与应用,智慧公厕作为公共服务设施,正迎来一次新的升级与革新。利用先进技术,智慧公厕实现了信息化升级,能够实时监测人员、环境和设备状况,提高使用效率、安全性、舒适…...
gin-vue-admin二开使用雪花算法生成唯一标识 id
场景介绍 需求场景: 总部采集分支的数据,由于分支的 id 是子增的主键 id,所以会出现重复的 id,但是这个 id 需要作为标识,没有实际作用,这里选择的是分布式 id 雪花算法生成 id 存储用来标识,这…...
文心一言 vs. ChatGPT:哪个更胜一筹?
文心一言 vs. ChatGPT:从简洁美到深度思考的文本生成之旅 近年来,文本生成工具的崛起使得人们在表达和沟通方面拥有了更多的选择。在这个领域中,文心一言和ChatGPT作为两个备受瞩目的工具,各自以独特的优势展现在用户面前。本文将…...
LoadBalancer 替换 Ribbon
POM 移除 Ribbon 相关依赖 <!-- LoadBalancer 必须引入 springcloud --> <!-- 父pom引入springcloud 版本管理 --> https://spring.io/projects/spring-cloud/ 官网查看 boot 对应的 cloud 的版本 <dependencyManagement><dependency> <groupI…...
Jsqlparser简单学习
文章目录 学习链接模块访问者模式parser模块statement模块Expression模块deparser模块 测试TestDropTestSelectTestSelectVisitor 学习链接 java设计模式:访问者模式 github使用示例参考 测试 JSqlParser使用示例 JSqlParse(一)基本增删改…...
IC验证——perl脚本ccode_standard——c代码寄存器配置标准化
目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路…...
Qt单个字符判断
1.相关说明 字符的Unicode编码、单个字符的判断 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui;…...
通过OpenIddict设计一个授权服务器02-创建asp.net项目
在这一部分中,我们将创建一个ASPNET核心项目,作为我们授权服务器的最低设置。我们将使用MVC来提供页面,并将身份验证添加到项目中,包括一个基本的登录表单。 创建一个空的asp.net core项目 正如前一篇文章中所说,授权…...
2.6、云负载均衡产品详述
一、定义 弹性负载均衡(Elastic Load Balance,简称ELB)可将来自公网的访问流量分发到后端云主机,可选多种负载均衡策略,并支持自动检测云主机健康状况,消除单点故障,保障应用系统的高可用。 二、产品架构 1&am…...
黑马程序员 Docker笔记
本篇学习笔记文档对应B站视频: 同学们,在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么? 我相信,除了个别天赋异禀的同学以外,大多数同学都会有相同的…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
