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

《21天学通C++》(第十九章)STL集合类(set和multiset)

为什么需要setmultiset:
1.自动排序: set和multiset会自动按照元素的值进行排序。
2.快速查找: 由于元素是有序的,set和multiset可以提供对元素的快速查找,通常是基于二叉搜索树实现的,查找操作的时间复杂度为O(log n)。
3.set的唯一性保证: set保证了容器中元素的唯一性,即不会有重复的元素。这在需要确保数据集中没有重复项时非常有用。

1.实例化std::set和std::multiset

需要添加头文件<set>

//默认类型实例化
std::set<int> mySet;
std::multiset<int> myMultiSet;//自定义类实例化(假设有MyClass类)
std::set<MyClass> mySet;
std::multiset<MyClass> myMultiSet;

2.在set或multiset中插入元素

可以使用insert()

下面以set为例子展示,multiset操作与其一致,但允许插入重复元素

#include<iostream>
#include <set>
int main(){std::set<int> mySet;// 插入单个元素mySet.insert(10);for(int num:mySet){std::cout<<num<<" ";}//输出结果为10std::cout<<std::endl;// 插入多个元素mySet.insert({30, 20, 40});for(int num:mySet){std::cout<<num<<" ";}//输出结果10 20 30 40,因为会插入元素后会自动排序std::cout<<std::endl;// 插入迭代器范围内的元素int arr[] = {50, 60, 70};mySet.insert(std::begin(arr), std::end(arr));for(int num:mySet){std::cout<<num<<" ";}//输出结果为10 20 30 40 50 60 70system("pause");return 0;
}

3.在set或multiset中查找元素

使用find()成员函数,用于查找容器中是否存在某个元素。它返回一个迭代器,如果元素存在,则指向找到的元素;如果元素不存在,则返回end()。

下面以set为例子展示,multiset操作与其一致,但若含有多个相同的符合条件的值,则只指向第一个

#include<iostream>
#include <set>
int main(){std::set<int> mySet = {1, 2, 3, 4, 5};auto it1 = mySet.find(3); // 查找元素 3if (it1 != mySet.end()) {// 找到元素std::cout << "Found: " << *it1 << std::endl;} else {// 元素不存在std::cout << "Not found" << std::endl;}//输出结果为“Found:3”auto it2 = mySet.find(6); // 查找元素 3if (it2 != mySet.end()) {// 找到元素std::cout << "Found: " << *it2 << std::endl;} else {// 元素不存在std::cout << "Not found" << std::endl;}//输出结果为“Not found”system("pause");return 0;
}

4.删除set或multiset中的元素

使用erase()成员函数,有以下几个重载版本
删除特定元素

mySet.erase(someValue); // 删除一个特定值

删除迭代器指向的元素

auto it = mySet.find(someValue);
if (it != mySet.end()) {mySet.erase(it); // 删除迭代器指向的元素
}

删除一定范围内的元素

mySet.erase(mySet.begin(), mySet.end()); // 使用迭代器指定边界

下面以multiset为例子,set操作类似

#include <iostream>
#include <set>int main() {// 实例化一个 std::multisetstd::multiset<int> myMultiSet = {1, 2, 3, 4, 4, 5};// 创建一个副本,删除指定值4auto count1 = myMultiSet;count1.erase(4);for(auto num:count1){std::cout<<num<<" ";}//输出结果为1 2 3 5,会把所有符合条件的都删除std::cout<<std::endl;// 创建一个副本,删除迭代器指向的元素3auto count2 = myMultiSet;auto it = count2.find(3);if (it != count2.end()) {count2.erase(it);}for(auto num:count2){std::cout<<num<<" ";}//输出结果为1 2 4 4 5std::cout<<std::endl;// 创建一个副本,删除一定范围的元素auto count3 = myMultiSet;count3.erase(count3.begin(), count3.find(3));//把开头到元素3(不包括3)都删除for(auto num:count3){std::cout<<num<<" ";}//输出结果为3 4 4 5system("pause");return 0;
}

5.std::unordered_setstd::unordered_multiset

从C++11起引入了这两种容器,它们是基于散列表(哈希表)实现的,相较于set和multiset,他们有以下优缺点:

优点

  1. 平均时间复杂度: 由于哈希表的特性,在理想情况下,插入、删除和查找操作平均时间复杂度为O(1),比set和multiset的O(log n)更快
  2. 更快的访问速度: 在元素较多且冲突较少的情况下,访问速度更快

缺点

  1. 最坏情况时间复杂度: 在最坏情况下,时间复杂度为O(n),比set和multiset更慢
  2. 不适合有序遍历: 这两种容器不保证元素的有序性

相关文章:

《21天学通C++》(第十九章)STL集合类(set和multiset)

为什么需要set和multiset: 1.自动排序&#xff1a; set和multiset会自动按照元素的值进行排序。 2.快速查找&#xff1a; 由于元素是有序的&#xff0c;set和multiset可以提供对元素的快速查找&#xff0c;通常是基于二叉搜索树实现的&#xff0c;查找操作的时间复杂度为O(log …...

CSDN上是不是有机器人点赞和收藏?

我在CSDN上写作&#xff0c;主要是本来是记录学习工作中的一些知识点&#xff0c;看得人不多本来就能预想到的。 但是今天发现五一写的一篇博客&#xff0c;出现了很奇怪的阅读、点赞、收藏数。只有2个人阅读&#xff0c;但是有8个点赞&#xff0c;还有5个收藏。 我不禁怀疑CS…...

头歌C语言课程实验(递归函数、嵌套函数)

第1关&#xff1a;递归求阶乘数列 任务描述 题目描述&#xff1a;用递归求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字。 相关知识&#xff08;略&#xff09; 编程要求 请仔细阅读右侧代码&#xff0c;结合相关知识&#xff0c;在Begin-End区域内进行代码补充。 输…...

树莓派的几种登录方式、及登录失败解决方式

使用TF卡安装树莓派的系统后&#xff0c;可以通过编辑TF卡里的文件来设置和启用 “ VNC ” 、“ SSH ” 和 “ 串口 ” 功能。不过&#xff0c;在使用中打开VNC和SSH可能并不直观或方便&#xff0c;因为这些服务通常在树莓派的系统内部配置和启动。但你可以通过以下步骤来设置和…...

数据库中视图的知识点

视图&#xff08;子查询&#xff09;&#xff1a;是从一个或多个表导出的虚拟的表&#xff0c;其内容由查询定义。具有普通表的结构&#xff0c;但是不实现数据存储。对视图的修改&#xff1a;单表视图一般用于查询和修改&#xff0c;会改变基本表的数据&#xff0c;多表视图一…...

aardio封装库) 微软开源的js引擎(ChakraCore)

前言 做爬虫肯定少不了JavaScript引擎的使用&#xff0c;比如在Python中现在一般用pyexecjs2来执行JavaScript代码&#xff0c;另外还有一些其他执行JavaScript的库&#xff1a; https://github.com/eight04/node_vm2: rpc调用nodejs&#xff0c;需要安装nodehttps://github.…...

LeetCode-hot100题解—Day6

原题链接&#xff1a;力扣热题-HOT100 我把刷题的顺序调整了一下&#xff0c;所以可以根据题号进行参考&#xff0c;题号和力扣上时对应的&#xff0c;那么接下来就开始刷题之旅吧~ 1-8题见LeetCode-hot100题解—Day1 9-16题见LeetCode-hot100题解—Day2 17-24题见LeetCode-hot…...

【Linux】gcc/g++的使用

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中gcc/g使用的相关内容。 如果看到最后您觉得这篇文章写得不错…...

2024-5-3学习笔记 虚拟继承原理

目录 原理 总结 前面提到过&#xff0c;解决菱形继承产生的数据二义性问题和数据冗余&#xff0c;就需要用到虚拟继承&#xff0c;关于它是如何解决的&#xff0c;我们来一起研究。 class Person { public :string _name ; // 姓名 }; class Student : virtual public Perso…...

C语言什么是“野指针”?

一、问题 “野指针”是⼀个⽐较陌⽣的术语&#xff0c;那么它到底是什么呢&#xff1f; 二、解答 当程序⾥声明了⼀个指针⽽又没有给这个指针赋值&#xff0c;使其指向⼀个地址时&#xff0c;这样的指针就称为“野指针”。 “野指针”会随意地指向⼀个地址。当对这个指针进⾏操…...

LeetCode--所有质数、质数对

1.0 Q: 输出 100 以内所有质数 1.1 /* 第一层循环控制检查到哪个数* 第二层通过遍历除以每个比他小的数的方式,检查每个数是不是质数* 由于要遍历检查,设置一个标记,只要任意一次循环可以整除,我们就设置该标记为不是质数 */boolean isPrime true;for (int i 2; i < 100…...

JavaScript异步编程——05-回调函数

我们在前面的文章《JavaScript 基础&#xff1a;异步编程/单线程和异步》中讲过&#xff0c;Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时&#xff0c;⼤部分情况都是通过回调函数来进⾏。 &#xff08;如果你还不了解单线程和异步的概念&#xff0c;可以先去回顾上一…...

JAVA基础之jsp标准标签

jsp动作标签实现实例化一个实体类 <jsp:useBean id"标识符" class"java类名" scope"作用范围"> 传统的java方式实例化一个实体类 Users user new Users(); <%%> id: 对象名 * class:类 创建对象时,完全限定名(包名…...

VM16激活码以及连接centos7过慢的问题

一、激活码 任选一个&#xff0c;直到能用为止 ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8 FA1M0-89YE3-081TQ-AFNX9-NKUC0 二-连接centos7过慢的问题 先备份/etc/ssh/sshd_config,备份命令为 cp /etc/ssh/sshd_config /etc/…...

MySQL 迁移到 Oracle 需要注意的问题

MySQL /Oracle 常见问题 1. VARCHAR/VARCHAR2/NVARCHAR 差异&#xff1a; MySQL 的 VARCHAR 是以字符为单位计算的&#xff0c;Oracle 的 VARCHAR 是 以字节为单位计算的&#xff0c;所以对中文的存储 Oracle 是 MySQL 的 2 倍 (GBK)和 3 倍(UTF8) 2. NULL 差异 A. MySQL…...

【数字经济】上市公司供应链数字化数据(2000-2022)

数据来源&#xff1a; 时间跨度&#xff1a;2000-2022年 数据范围&#xff1a;各上市企业 数据指标&#xff1a; 样例数据&#xff1a; 参考文献&#xff1a;[1]刘海建,胡化广,张树山,等.供应链数字化的绿色创新效应[J].财经研究,2023,49(03):4-18. 下载链接&#xff1a;https:…...

通过AOP实现项目中业务服务降级功能

最近项目中需要增强系统的可靠性&#xff0c;比如某远程服务宕机或者网络抖动引起服务不可用&#xff0c;需要从本地或者其它地方获取业务数据&#xff0c;保证业务的连续稳定性等等。这里简单记录下业务实现&#xff0c;主要我们项目中调用远程接口失败时&#xff0c;需要从本…...

LeetCode:盛最多水的容器

文章收录于LeetCode专栏 盛最多水的容器 给你n个非负整数a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;每个数代表坐标中的一个点(i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线i的两个端点分别为(i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与…...

阿里云 OSS桶对象存储攻防

目录 Bucket权限配置错误-公开访问 Bucket桶爆破 特定的Bucket策略配置 Bucket Object遍历...

外网禅道配置

exportfs -avrf 修改代码&#xff0c;避免启动太慢&#xff1a;vi /opt/zbox/bin/zbox.php 启动和停止 /opt/zbox/zbox start /opt/zbox/zbox stop...

Lenovo Legion Toolkit 终极指南:如何让你的拯救者笔记本性能提升30%

Lenovo Legion Toolkit 终极指南&#xff1a;如何让你的拯救者笔记本性能提升30% 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...

HCV NS4A Protein (22-34) (H strain) ;CVVIVGRVVLSGLK

一、基础信息多肽名称&#xff1a;丙型肝炎病毒 NS4A 蛋白片段 (22-34) H 株英文&#xff1a;HCV NS4A Protein (22-34) (H strain)三字母序列&#xff1a;Cys-Val-Val-Ile-Val-Gly-Arg-Val-Val-Leu-Ser-Gly-Lys单字母序列&#xff1a;CVVIVGRVVLSGLK氨基酸数量&#xff1a;13 …...

Windows 11 LTSC系统一键恢复Microsoft Store的终极解决方案

Windows 11 LTSC系统一键恢复Microsoft Store的终极解决方案 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否在使用Windows 11 24H2 LTSC版本时…...

避开这3个坑,你的SAR影像预处理效率翻倍:ENVI SARscape实战心得

避开这3个坑&#xff0c;你的SAR影像预处理效率翻倍&#xff1a;ENVI SARscape实战心得 在遥感数据处理领域&#xff0c;SAR影像因其全天候、全天时的独特优势&#xff0c;已成为地质灾害监测、海洋观测等领域不可或缺的数据源。然而&#xff0c;许多从业者在初次接触ENVI SARs…...

DDR2 / DDR3 / DDR4 颗粒信号差异对照表

DDR2 与 DDR3 颗粒引脚信号一一对应对照表信号组别DDR2 信号名DDR3 对应信号名功能一致差异说明差分时钟CK、CK#CK、CK#✅ 完全一致功能、时序定义相同&#xff0c;仅电平不同时钟使能CKECKE✅ 完全一致高低电平逻辑、工作模式控制相同硬件复位无RESET#❌ DDR2 无DDR3 新增&…...

为什么你的课程推荐越来越不准?Perplexity查询功能2024Q2算法升级内幕(附绕过冷启动限制的私有指令)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;为什么你的课程推荐越来越不准&#xff1f;Perplexity查询功能2024Q2算法升级内幕&#xff08;附绕过冷启动限制的私有指令&#xff09; Perplexity 在 2024 年第二季度对课程推荐核心查询模块进行了深度重构&…...

【最新v2.7.5 版本安装包】OpenClaw 2.7.5 保姆级教程,零基础无需命令一键部署不踩坑

&#x1f680; OpenClaw 一键安装包&#xff5c;一键部署甩掉复杂环境配置 【点击下载最新安装包】https://xiake.yun/api/download/package/16?promoCodeIVBE1F235167 &#x1f4cc; 适配信息 适配系统&#xff1a;Windows10/11 64 位 当前版本&#xff1a;v2.7.5&#xff…...

当你的BERT模型被‘下毒’了怎么办?聊聊NLP后门攻击的实战检测与防御(附ONION、T-Miner工具实操)

当BERT模型遭遇后门攻击&#xff1a;一线工程师的检测与防御实战指南 在部署基于BERT的文本分类服务时&#xff0c;许多团队会忽略一个潜在威胁——模型可能已在训练阶段被植入后门。这类攻击极其隐蔽&#xff1a;模型对正常输入表现完美&#xff0c;但当遇到特定触发词&#x…...

为了一个过时的Qt4组件,我折腾了一下午的MinGW 4.8.2和Qt Creator 3.3.0

当Qt4遇上现代开发环境&#xff1a;一次复古技术栈的生存指南 那天下午&#xff0c;当我打开那本泛黄的《Qt Creator快速入门》第3版时&#xff0c;完全没预料到即将陷入一场持续六小时的版本适配噩梦。书中的phonon多媒体模块示例代码在Qt5环境中频频报错&#xff0c;搜索后才…...

32dB增益+79%效率:HT20340S在工业射频能源中的高能效设计

HT20340S&#xff1a;400W LDMOS宽带射频功率放大器在大功率射频能量应用、工业加热、等离子体激励以及宽带通信等领域&#xff0c;功率放大器&#xff08;PA&#xff09;的性能直接决定了系统的发射效率与作用距离。当需要在10MHz至300MHz的宽带范围内实现数百瓦的连续波输出时…...