当前位置: 首页 > news >正文

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容器的内容

四、使用注意事项

(一)优势:

  1. 自动排序std::set 中的元素自动根据其值进行排序。你不需要像使用数组或链表那样手动排序。
  2. 唯一性std::set 只存储唯一的元素,这样可以确保数据的一致性,不会出现重复的数据。
  3. 高效的查找操作:由于 std::set 实现为红黑树,其查找、插入和删除操作的平均时间复杂度为 O(log n)。
  4. 标准容器std::set 是 C++ 标准库的一部分,因此与其它标准库组件有良好的兼容性。

(二)劣势:

  1. 值的不可变性:一旦将一个元素插入到 std::set 中,你就不能更改该元素的值。如果你需要修改一个元素的值,你需要先删除旧的元素,然后插入新的元素。
  2. 内存使用:由于 std::set 需要为每个元素分配内存并维护一棵红黑树,所以它的内存使用可能会比其它容器(如数组或向量)更高。

(三)使用时需要注意的事项:

  1. 元素的唯一性:由于 std::set 存储唯一的元素,如果你尝试插入一个已经存在的元素,std::set 将不会做任何事情,即不会插入重复的元素。因此,在插入元素之前,你可能需要检查元素是否已经存在于 set 中。
  2. 迭代器的稳定性std::set 的迭代器在删除元素后可能会失效。如果你在迭代过程中删除元素,可能会导致未定义的行为。为了安全地删除元素,你可以先保存要删除元素的迭代器,然后在迭代完成后再进行删除。
  3. 与其它容器的交互:当与其它容器(如 std::vector 或 std::list)进行交互时,需要注意 std::set 的特性。例如,将一个元素从一个 set 移动到另一个 set 或从 set 移动到另一个容器时,需要特别小心。
  4. 自定义比较函数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容器是一种具备自动排序功能的集合&#xff0c;默认递增排序&#xff1b;元素无法直接修改&#xff0c;且不能重复&#xff1b;另一个版本叫做multiset&#xff0c;允许存在重复元素&#xff0c;其他功能和性质一样。 set容器底层结构一般为自平衡二叉搜索树…...

Vim一键配置指南,打造高效率C++开发环境

文章目录 前言安装与卸载功能演示gcc/g升级问题 前言 Vim作为当下最受欢迎的文本编译器之一&#xff0c;不仅具有强大的文本编辑功能&#xff0c;还提供了高度的可定制性。用户可以根据自己的喜好自定义配置&#xff0c;并且通过自己编写插件或者使用现有的插件来扩展Vim的功能…...

新航向,新生态: Michael在出海业务圆桌会议分享HyperBDR全球业务拓展之道

1月15日-16日&#xff0c;以“领航新开局&#xff0c;共赢新生态”为主题的华为云生态大会2024在华为云贵安数据中心云上屯盛大举行。本次会议聚焦于华为云全国生态伙伴与开发者&#xff0c;旨在共同见证华为云生态战略的最新进展和伙伴政策的新升级。与会者将分享来自优秀生态…...

SpringBoot异步处理

Spring boot异步处理 业务场景&#xff1a; 如执行数据库备份任务&#xff0c;前端发起请求到后端&#xff0c;后端备份数据库的处理逻辑需要很长一段时间&#xff0c;此时前端会一直等待后端返回结果&#xff0c;给用户给等待时间过长&#xff0c;这是就要考虑异步处理了&…...

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…...

matplotlib绘制动态瀑布图

绘制瀑布图思路&#xff1a;遍历指定文件目录下所有的csv文件&#xff0c;每读一个文件&#xff0c;取文件前20行数据进行保存&#xff0c;如果超过规定的行数300行&#xff0c;将最旧的数据删除&#xff0c;仅保留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&#xff0c;下标) in 数组” v-for“(对象item&#xff0c;使用这个键取到的值&#xff0c;下标) in 数组” :key 绑定标识 一般建议使用对象中的id等值 类型 any <template><view><view clas…...

SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤 三、使用Core API访问与操作数据库 Sqlalchemy 的Core部分集成了DB API, 事务管理&#xff0c;schema描述等功能&#xff0c;ORM构筑于其上。本章介绍创建 Engine对象&#xff0c;使用基本的…...

PDF有编辑密码怎么办

目录 注意&#xff1a; windows方法&#xff1a; 1 python 下载 2 打开命令行 3 安装 pikepdf 4 编写python脚本 5 使用py脚本 6解密完成 Linux方法&#xff1a; 注意&#xff1a; 此方法可以用于破解PDF的编辑密码&#xff0c;而不是PDF的打开密码 当遇到类似如下问…...

智慧公厕:打造智慧城市公共厕所信息化管理的新升级

在现代社会中&#xff0c;随着科学技术的不断进步与应用&#xff0c;智慧公厕作为公共服务设施&#xff0c;正迎来一次新的升级与革新。利用先进技术&#xff0c;智慧公厕实现了信息化升级&#xff0c;能够实时监测人员、环境和设备状况&#xff0c;提高使用效率、安全性、舒适…...

gin-vue-admin二开使用雪花算法生成唯一标识 id

场景介绍 需求场景&#xff1a; 总部采集分支的数据&#xff0c;由于分支的 id 是子增的主键 id&#xff0c;所以会出现重复的 id&#xff0c;但是这个 id 需要作为标识&#xff0c;没有实际作用&#xff0c;这里选择的是分布式 id 雪花算法生成 id 存储用来标识&#xff0c;这…...

文心一言 vs. ChatGPT:哪个更胜一筹?

文心一言 vs. ChatGPT&#xff1a;从简洁美到深度思考的文本生成之旅 近年来&#xff0c;文本生成工具的崛起使得人们在表达和沟通方面拥有了更多的选择。在这个领域中&#xff0c;文心一言和ChatGPT作为两个备受瞩目的工具&#xff0c;各自以独特的优势展现在用户面前。本文将…...

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设计模式&#xff1a;访问者模式 github使用示例参考 测试 JSqlParser使用示例 JSqlParse&#xff08;一&#xff09;基本增删改…...

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig&#xff1b;.&#xff1b;..&#xff1b;./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项目

在这一部分中&#xff0c;我们将创建一个ASPNET核心项目&#xff0c;作为我们授权服务器的最低设置。我们将使用MVC来提供页面&#xff0c;并将身份验证添加到项目中&#xff0c;包括一个基本的登录表单。 创建一个空的asp.net core项目 正如前一篇文章中所说&#xff0c;授权…...

2.6、云负载均衡产品详述

一、定义 弹性负载均衡(Elastic Load Balance&#xff0c;简称ELB)可将来自公网的访问流量分发到后端云主机&#xff0c;可选多种负载均衡策略&#xff0c;并支持自动检测云主机健康状况&#xff0c;消除单点故障&#xff0c;保障应用系统的高可用。 二、产品架构 1&am…...

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频&#xff1a; 同学们&#xff0c;在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&#xff0c;大多数同学都会有相同的…...

思源宋体:免费商用中文字体的全面应用指南

思源宋体&#xff1a;免费商用中文字体的全面应用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字设计领域&#xff0c;字体如同视觉沟通的语言。Source Han Serif TTF&…...

# 发散创新:基于 Rust的分布式数据库架构设计与实战演练在当前云原生和微服务架

发散创新&#xff1a;基于 Rust 的分布式数据库架构设计与实战演练 在当前云原生和微服务架构盛行的背景下&#xff0c;分布式数据库已成为高并发、高可用系统的核心基础设施。本文将深入探讨如何使用 Rust 编程语言构建一个轻量级但功能完整的分布式数据库原型&#xff0c;重点…...

深入XFS文件系统:从一次CentOS 7的Internal error报错,聊聊xfs_repair背后的原理与避坑指南

深入XFS文件系统&#xff1a;从Internal error报错到修复原理与实战指南 当你在一台运行CentOS 7的生产服务器上看到"XFS_WANT_CORRUPTED_GOTO"这个鲜红的报错信息时&#xff0c;作为运维工程师的肾上腺素会立刻飙升。这不是一个普通的I/O错误&#xff0c;而是XFS文件…...

Java开发者必看:Lingbot深度模型服务端集成与高并发处理

Java开发者必看&#xff1a;Lingbot深度模型服务端集成与高并发处理 最近和几个做Java后端的朋友聊天&#xff0c;发现大家对接AI模型服务时&#xff0c;都遇到了类似的头疼事。模型本身效果不错&#xff0c;但一集成到自己的Spring Boot项目里&#xff0c;特别是流量稍微大点…...

颠覆传统数学输入:MathLive交互式公式编辑器三步实现跨平台数学表达

颠覆传统数学输入&#xff1a;MathLive交互式公式编辑器三步实现跨平台数学表达 【免费下载链接】mathlive A web component for easy math input 项目地址: https://gitcode.com/gh_mirrors/ma/mathlive 在数字化教育与科研领域&#xff0c;数学公式的编辑始终是制约效…...

WPF拖拽实战避坑指南:从DragDropEffects到QueryContinueDrag,解决拖拽后鼠标事件失效的诡异问题

WPF拖拽实战避坑指南&#xff1a;从DragDropEffects到QueryContinueDrag&#xff0c;解决拖拽后鼠标事件失效的诡异问题 当你在WPF项目中实现拖拽功能时&#xff0c;是否遇到过这样的场景&#xff1a;拖拽操作完成后&#xff0c;控件的MouseMove事件突然"失灵"&#…...

手把手教你用KVM在openEuler 22.03 LTS上安装华为FusionCompute 6.5.1 CNA(含VNC避坑指南)

深度实战&#xff1a;在openEuler 22.03 LTS上通过KVM部署FusionCompute CNA全流程解析 当企业需要构建私有云环境时&#xff0c;华为FusionCompute作为成熟的虚拟化平台常被列为首选方案。本文将完整呈现如何在openEuler 22.03 LTS系统中&#xff0c;通过KVM虚拟化技术实现Fus…...

DEFOM-Stereo vs RAFT-Stereo:双目匹配领域的新旧王者对比实测(附KITTI数据集结果)

DEFOM-Stereo与RAFT-Stereo&#xff1a;双目视觉技术的实战性能解析 在计算机视觉领域&#xff0c;双目立体匹配技术一直是实现三维场景重建和环境感知的核心方法之一。近年来&#xff0c;随着深度学习技术的快速发展&#xff0c;RAFT-Stereo等基于神经网络的双目匹配算法已经展…...

小产后吃什么恢复快?科学修护助力身体回归健康

小产对女性身体的损伤不容忽视&#xff0c;气血亏虚、子宫损伤等问题若调理不当&#xff0c;可能留下长期健康隐患。当前&#xff0c;小产后修护已成为女性健康领域的重要关注点&#xff0c;如何通过科学方式实现高效恢复&#xff0c;避免浅层调理带来的后续问题&#xff0c;是…...

避开这3个坑!uni-app直传腾讯云COS的实战避坑指南

uni-app直传腾讯云COS的三大高频问题与增强方案 1. 临时密钥失效的实战解决方案 临时密钥失效是开发者最常遇到的痛点之一。想象一下这样的场景&#xff1a;用户正在上传重要文件&#xff0c;突然提示"密钥已过期"&#xff0c;这种体验有多糟糕&#xff1f;我们先来…...