《探索C++ set与multiset容器:深入有序唯一性集合的实现与应用》

前引:在STL的关联式容器中,set以其严格的元素唯一性自动排序特性成为处理有序数据的核心工具。其底层基于红黑树(Red-Black Tree)实现,保证了O(log n)的查找、插入与删除复杂度!本文将从底层原理切入,结合关键操作源码剖析,探讨set在去重排序、高效检索等场景的工程实践。通过对比unordered_set与自定义排序规则,揭示其在内存效率与访问性能的平衡艺术 !

目录

【一】set 与 multiset 的介绍

【二】特点详解

(1)自动排序

(2)唯一元素

(3)高效操作

(4)不支持随机访问

(5)迭代器支持

【三】接口学习

(1)构造

(2)插入

(3)迭代器访问

(4)范围for访问

(5)find 搜索+erase 删除

(6)find 搜索 与 count搜索

(7)lower 与 upper

(8)元素个数

(9)equal_range


【一】set 与 multiset 的介绍

完整解释:

在C++标准模板库(STL)中,set是一种关联容器,用于存储唯一元素(本身是 key),并自动按升序排序。它基于红黑树(一种自平衡二叉搜索树)实现,提供了高效的查找、插入和删除操作。set常用于需要快速访问和唯一性保证的场景,如去重、排序或作为字典键

set 通俗理解:

基于红黑树实现的一种容器,具有自动排序(升序)+不重复的特点

 multiset 通俗理解:

基于红黑树实现的一种容器,具有自动排序(升序)特点,但 multiset 的节点允许键值重复

【二】特点详解

(1)自动排序

自动排序简而言之就是当你存入数据到 set 容器时,它会自动把它插入到合适的位置,从而实现自动排序,感觉就像《搜索二叉树+中序遍历》例如:

插入(1,、9、7、6),set 容器里面存储(1、6、7、9)

(2)唯一元素

唯一性体现在数据的独一无二,例如:

插入(1、2、3、3、3、7、7、6),set 容器里面存储(1、2、3、6、7)

(3)高效操作

查找  插入  删除:我们可以根据《搜索二叉树》理解,每次折半,那么时间复杂度可以保证在O(logn),这些高效性源于红黑树的平衡特性!

(4)不支持随机访问

它的结构不是像数组那样的下标访问,元素的位置由树结构决定

(5)迭代器支持

支持正向和反向两种迭代器(下文有例举!)

【三】接口学习

(1)构造

set 比较常使用的是默认构造:set + 数据类型 + 变量

set<int> V;
(2)插入
V.insert(9);
(3)迭代器访问
set<int>::iterator it = V.begin();
while (it != V.end())
{cout << *it << " ";it++;
}

(4)范围for访问
for (auto e : V)
{cout << e << " ";
}

(5)find 搜索+erase 删除

第一种查找:库里面通用的查找函数,属于暴力查找,时间复杂度为 O(N)

第二种查找:set 容器里面的,根据 set 的结构查找,时间复杂度为 O(logn)

//搜索+删除auto st = find(V.begin(), V.end(), 5);    //第一种
auto st = V.find(8);                      //第二种
if (st != V.end())
{V.erase(10);
}

(6)find 搜索 与 count搜索

find:如果找到指定元素了,会返回它的位置,否则返回end

count:如果找到指定元素返回1,否则返回0

(7)lower 与 upper

lower_bound:返回范围内 >= 指定元素的位置,否则返回end

例如:(1,2,3,4,6,7,8)查找4,返回4的位置;查找5,返回6的位置

upper_bound:返回范围内指定元素的位置,否则返回end

例如:(1,2,3,4,6,7,8)查找4,返回6的位置

(8)元素个数
V.size();

(9)equal_range

返回值:

该函数返回一个 pair

其成员 pair::first 是范围的下限(与 lower_bound 相同)>=

pair::second 是上限(与 upper_bound 相同)>

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

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

相关文章

各测试平台功能对比分析(ITP,Postman,Apifox,MeterSphere)

对比ITP与Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口测试✅ 可视化接口调试&#xff0c;支持多种请求方式✅ 支持✅ 支持✅ 支持场景测试✅ 多接口串联测试&#xff0c;支持前后置脚本✅ Collections功能✅ 支持✅ 支持定时任务✅ 基于Celery的定时…

开源日志log4cplus—如何将 string类型转为tstring类型,又如何将char*类型转换为tstring类型?

文章目录&#x1f527; 一、理解 log4cplus::tstring 的本质⚙️ 二、std::string 转 tstring 的三种方法✅ 1. 使用内置宏 LOG4CPLUS_STRING_TO_TSTRING&#xff08;推荐&#xff09;✅ 2. 手动条件编译转换&#xff08;精细控制&#xff09;✅ 3. 多字节模式下的直接赋值⚙️…

深度学习之CNN网络简介

CNN网络简单介绍 1.概述 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种专门用于处理具有网格状结构数据的深度学习模型。 ​ CNN网络主要有三部分构成&#xff1a;卷积层、池化层和全连接层构成&#xff0c;其中卷积层负责提取图像中…

【微实验】基频提取的MATLAB实现(优化版)

前情提要&#xff1a; 【超详细】科普&#xff1a;别再只会用自相关&#xff01;YIN 和 PYIN 如何破解音频隐藏密码&#xff1f;-CSDN博客 【微实验】妈妈我的MATLAB会识别声音的基频了&#xff01;-CSDN博客 今天用MATLAB把算法封装成函数&#xff0c;然后调用对比结果。 …

开发 npm 包【详细教程】(含发布 npm 包,版本号升级,修改包后重新发布等)

1. 给 npm 包取个【唯一】的名字&#xff01; npm 包命名规范 只能包含小写字母&#xff08;a-z&#xff09;、数字&#xff08;0-9&#xff09;、连字符&#xff08;-&#xff09; 和 下划线&#xff08;_&#xff09;&#xff0c;不能包含空格、大写字母、标点符号&#xff…

Secure 第三天作业

实验需求&#xff1a;1.参考以上拓扑所示&#xff0c;完成以下需求&#xff1a;1&#xff09; 配置各设备 IP 地址2&#xff09; 配置 ZBFW&#xff0c;Inside-1 和 nside-2 属于内部 Zone&#xff0c;Outside-1 属于外部 Zonezone security insidezone security outsidezone-p…

Linux应用层-5.计算机网络(菜鸟学习笔记)

计算机网络的核心是连接与通信&#xff0c;从底层的物理信号到上层的应用服务&#xff0c;各层协议协同工作---------------------------------------------------------------------------------------一.计算机网络分类&#xff08;按范围&#xff09;1•个人区域网&#xff…

[论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼

大型语言模型对决传统方法&#xff1a;多语言漏洞修复能力大比拼 论文阅读&#xff1a;On the Evaluation of Large Language Models in Multilingual Vulnerability RepairarXiv:2508.03470 On the Evaluation of Large Language Models in Multilingual Vulnerability Repair…

计算机网络2-3:传输方式

目录 串行传输和并行传输 同步传输和异步传输 单工、半双工以及全双工通信 总结 串行传输和并行传输 并行传输的优点是速度为串行传输的n倍&#xff0c;但也存在一个严重的缺点即成本高 同步传输和异步传输 单工、半双工以及全双工通信 总结

文档生成PPT软件哪个好?深度测评8款word转ppt生成工具

在日常办公与教学场景中&#xff0c;如何高效地将Word文档内容转化为专业PPT&#xff0c;一直是职场人士、教育工作者及内容创作者的共同痛点。随着AI技术的普及&#xff0c;一键式转换工具应运而生&#xff0c;它们不仅能精准识别Word中的标题与段落结构&#xff0c;还能自动套…

Azimutt:一款免费开源的多功能数据库工具

Azimutt 是一款支持数据库设计、表结构探索与分析、数据查询以及数据库文档生成功能的全栈工具。 Azimutt 是一个免费开源的项目&#xff0c;源代码托管在 GitHub&#xff1a; https://github.com/azimuttapp/azimutt 功能特性 多数据库支持&#xff1a;包括主流数据库 MySQ…

智算赋能:移动云助力“世界一流数据强港”建设之路

2024年5月&#xff0c;某创新产业园区智算中心正式揭牌成立。台下响起的掌声不仅是对一个项目的祝贺&#xff0c;更是客户对未来的期许—— 推动产业结构优化升级&#xff0c;领跑数字经济转型发展。5家500强企业、8家上市企业、17家独角兽企业……该创新产业园区在成为“世界一…

达梦自定义存储过程实现获取表完整的ddl语句

--导出表的ddl CREATE OR REPLACE PROCEDURE show_create_table( db IN varchar(255), tb IN varchar(255)) ASsql1 text;ret text : ;cmt text :;sql2 text :; BEGINFOR WSX IN (select TABLEDEF(db,tb) as ddl from dual) LOOPret: ret||WSX.DDL;END LOOP;ret : ret||chr(10…

【ARM】keil提示UVISION: Error: Encountered an improper argument

1、 文档目标 解决MDK退出debug模式后&#xff0c;提示UVISION: Error: Encountered an improper argument。 2、 问题场景 在退出Debug模式的时候&#xff0c;弹出提示窗口&#xff0c;提示&#xff1a;UVISION: Error: Encountered an improper argument。&#xff08;如图…

【2025最新版】PDF24 Creator,PDF编辑,合并分割,格式转换全能工具箱,本地离线版本,完全免费!

软件介绍&#xff08;文末获取&#xff09;这款软件于1999年开发&#xff0c;至今已经有26年了&#xff0c;这26年里它都完全免费&#xff01;简洁的操作界面&#xff0c;让用户轻松上手&#xff0c;高效完成 PDF 文件的处理&#xff0c;方便又实用。这次给大家带来的是一个本地…

如何使用VLLM进行openai/gpt-oss系列推理与支持工具调用

OpenAI时隔6年再次推出开源模型gpt-oss系列&#xff0c;本次gpt-oss系列包含两个模型gpt-oss-120b与gpt-oss-20b。由于模型原生支持一种新的量化技术MXFP4&#xff0c;所以模型的部署所需的显存也显著的降低。openai/gpt-oss-20b 只需要大概16GB的显存openai/gpt-oss-120b 需要…

SVN 查看历史信息

SVN 查看历史信息 引言 Subversion&#xff08;简称SVN&#xff09;是一个开源的版本控制系统&#xff0c;广泛应用于软件开发中。查看SVN的历史信息对于了解代码变更、追踪问题来源以及理解项目发展历程具有重要意义。本文将详细介绍如何在SVN中查看历史信息。 SVN历史信息概述…

vue+flask山西非遗文化遗产图谱可视化系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01;编号&#xff1a;F068 项目介绍&#xff1a; 本系统主要实现了以下功能&#xff1a; 非遗项目知识图谱可视化 非遗项目可视化关键词分析 …

Jetson NX Python环境搭建:使用APT轻松安装NumPy, scikit-learn, OpenCV

引言 在NVIDIA Jetson NX等ARM架构的嵌入式AI板子上搭建Python开发环境&#xff0c;特别是安装像NumPy、OpenCV这样包含C/C底层代码的科学计算库时&#xff0c;经常会遇到编译失败、耗时过长或依赖冲突等问题。这些问题尤其在通过pip从源代码编译安装时更为突出&#xff0c;例如…

Spring Boot项目中线程池的全面教程

一、线程池基础概念与重要性1.1 为什么需要线程池在Spring Boot应用中&#xff0c;线程池是一种至关重要的并发编程工具&#xff0c;它通过​​复用线程资源​​显著提升系统性能。主要优势包括&#xff1a;​​减少开销​​&#xff1a;避免频繁创建和销毁线程带来的性能损耗​…