C++STL set/multiset容器 构造和赋值 大小和交换 插入和删除 查找和统计
文章目录
- set/multiset容器
- 1 set容器 基本概念
- 2 set容器 构造和赋值
- 3 set容器 大小和交换
- 4 set容器 插入和删除
- 5 set容器 查找和统计
set/multiset容器
1 set容器 基本概念
简介: 所有元素都会在插入时会被自动排序,例如,在set容器放入元素1、5、9、3、4、7时,打印输出变成1、3、4、5、7、9.
本质: set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:
- set:不允许容器中有重复的元素,不能插重值元素
- multiset:允许容器中有重复的元素,可以插重值元素
- 两个容器使用时,包含头文件
#include<set>
即可
2 set容器 构造和赋值
功能描述: 创建set容器以及赋值
构造:
set<T> st;
//默认构造函数:set(const set &st);
//拷贝构造函数
注意: 和之前的容器不同,没有像string、vector、deque、list一样有push_back()、push_front()、pop_back()、pop_front()插入数据,也没有像stack、queue一样有push()和pop()插入数据。set插入数据时只有insert()。
赋值:
set& operator=(const set &st);
//重载等号操作符
代码示例:
void printSet(const set<int>& s)
{for (set<int>::const_iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void printmMultiset(const multiset<int>& s)
{for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void test()
{int n = 50;set<int> s1;//set只有insert()方式插入数据s1.insert(18);s1.insert(23);s1.insert(25);s1.insert(23);s1.insert(21);s1.insert(23);s1.insert(20);cout << "默认构造 set\t s1:";//set容器特点:所有元素插入时会被排序,且不允许有重复元素printSet(s1);cout << string(n, '-') << endl;set<int> s2(s1);cout << "拷贝构造 set\t s2:";printSet(s2);cout << string(n, '-') << endl;set<int> s3;s3 = s2;cout << "复制操作 set\t s3:";printSet(s3);cout << string(n, '-') << endl;multiset<int> s4;//multiset只有insert()方式插入数据s4.insert(18);s4.insert(23);s4.insert(25);s4.insert(23);s4.insert(21);s4.insert(23);s4.insert(20);cout << "默认构造 multiset s4:";//multiset容器特点:所有元素插入时会被排序,且允许有重复元素printmMultiset(s4);cout << string(n, '-') << endl;
}
总结:
- set容器插入数据时用insert
- set容器插入数据的数据会自动排序
- set不允许有重复元素,mutiset允许有重复元素
3 set容器 大小和交换
功能描述: 统计set容器大小以及交换set容器
函数原型:
size();
//返回容器中元素的数目empty();
//判断容器是否为空swap(st);
//交换两个集合容器
注意: 在set中没有resize(),不允许重新指定大小。在之前学习的容器中,resize()默认机制是0填充,而set不允许有重复值,所有不能有resize()。
代码示例:
void printSet(const set<int>& s)
{for (set<int>::const_iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void printmMultiset(const multiset<int>& s)
{for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void setisEmpty(const set<int>& s)
{if (s.empty()){cout << "set容器为空!" << endl;}else{cout << "set容器不为空,且容器大小为:" << s.size() << endl;}
}//大小
void test1()
{cout << "大小操作\n" << endl;int n = 50;set<int> s1;cout << "插值前 set\ts1:";printSet(s1);setisEmpty(s1);cout << string(n, '-') << endl;//set只有insert()方式插入数据s1.insert(18);s1.insert(23);s1.insert(25);s1.insert(23);s1.insert(21);s1.insert(23);s1.insert(20);cout << "插值后 set\ts1:";printSet(s1);setisEmpty(s1);cout << string(n, '-') << endl;
}//交换
void test2()
{cout << "\n交换操作\n\n交换前" << endl;int n = 50;multiset<int> s1;s1.insert(18);s1.insert(23);s1.insert(25);s1.insert(23);s1.insert(21);s1.insert(23);s1.insert(20);cout << "multiset\ts1:";printmMultiset(s1);cout << string(n, ' ') << endl;multiset<int> s2;s2.insert(14);s2.insert(10);s2.insert(15);s2.insert(11);s2.insert(12);s2.insert(13);cout << "multiset\ts2:";printmMultiset(s2);cout << string(n, '-') << endl;cout << "交换后\ns1:";printmMultiset(s1);cout << string(n, ' ') << endl;cout << "s2:";printmMultiset(s2);cout << string(n, '-') << endl;
}
总结:
- 统计大小 — size,不支持resize
- 判断是否为空 — empty
- 交换容器 — swap
4 set容器 插入和删除
功能描述: set容器进行插入数据和删除数据
函数原型:
insert(elem);
//在容器中插入元素。clear();
//清除所有元素erase(pos);
//删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end);
//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(elem);
//删除容器中值为elem的元素。
注意: 没有头插头删和尾插尾删的操作,插入只有insert。set的删除可以传入迭代器、区间,还可以指定值删除,类似于list的remove。
代码示例:
void printSet(const set<int>& s)
{for (set<int>::const_iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}//插入
void test1()
{int n = 50;set<int> s1;//set只有insert()方式插入数据s1.insert(18);s1.insert(23);s1.insert(25);s1.insert(23);s1.insert(21);s1.insert(23);s1.insert(20);cout << "删除前\t\ts1:";printSet(s1);cout << string(n, '-') << endl;//删除s1.erase(s1.begin());//删除第一个元素cout << "删除第一个元素\ts1:";printSet(s1);cout << string(n, '-') << endl;s1.erase(21);//删除指定元素cout << "删除指定元素\ts1:";printSet(s1);cout << string(n, '-') << endl;//清空//s1.erase(s1.begin(), s1.end());//erase清空s1.clear();cout << "清空\t\ts1:";printSet(s1);cout << string(n, '-') << endl;
}
总结:
- 插入 — insert
- 删除 — erase,可以指定元素删除,类似list的remove
- 清空 — clear
5 set容器 查找和统计
功能描述: 对set容器进行查找数据以及统计数据
函数原型:
find(key);
//查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(),结束的位置count(key);
//统计key的元素个数。对set而言,返回值是0或1,set不允许有重复值;对multiset而言,返回值有可能大于1,multiset允许有重复值。
代码示例:
void printSet(const set<int>& s)
{for (set<int>::const_iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void printMultiset(const multiset<int>& s)
{for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}void test1()
{int n = 50;set<int> s1;s1.insert(18);s1.insert(23);s1.insert(25);s1.insert(23);s1.insert(21);s1.insert(23);s1.insert(20);multiset<int> s2;s2.insert(18);s2.insert(23);s2.insert(25);s2.insert(23);s2.insert(21);s2.insert(23);s2.insert(20);cout << "s1:";printSet(s1);cout << string(n, ' ') << endl;cout << "s2:";printMultiset(s2);cout << string(n, '-') << endl;//查找cout << "\n查找" << endl;set<int>::iterator pos1 = s1.find(21);cout << "查找21元素\ns1:";if (pos1!=s1.end()){cout << "查找成功,值为:" << * pos1 << endl;}else{cout << "查找失败,值不存为或为空容器!" << endl;}cout << string(n, ' ') << endl;set<int>::iterator pos2 = s2.find(21);cout << "查找21元素\ns2:";if (pos2 != s2.end()){cout << "查找成功,值为:" << *pos2 << endl;}else{cout << "查找失败,值不存为或为空容器!" << endl;}cout << string(n, '-') << endl;//统计cout << "\n统计" << endl;int num1 = s1.count(23);cout << "set s1中23的个数为:" << num1 << endl;cout << string(n, '-') << endl;int num2 = s2.count(23);cout << "multiset s2中23的个数为:" << num2 << endl;cout << string(n, '-') << endl;
}
总结:
- 查找 — find (返回的是迭代器)
- 统计 — count (对于set,结果为0或者1)
相关文章:

C++STL set/multiset容器 构造和赋值 大小和交换 插入和删除 查找和统计
文章目录set/multiset容器1 set容器 基本概念2 set容器 构造和赋值3 set容器 大小和交换4 set容器 插入和删除5 set容器 查找和统计set/multiset容器 1 set容器 基本概念 简介: 所有元素都会在插入时会被自动排序,例如,在set容器放入元素1、…...

产品研发项目进度管理软件工具有哪些推荐?整理10款最佳进度管理软件
项目进度管理是确保项目按时完成的关键过程,使用合适的项目进度管理工具能确保帮助项目管理者实时了解和控制项目的进展情况,及时发现和解决问题,减少项目风险,提高项目效率和管理水平。这里将整理出国内外最受欢迎的10款项目进度…...

「ML 实践篇」分类系统:图片数字识别
目的:使用 MNIST 数据集,建立数字图像识别模型,识别任意图像中的数字; 文章目录1. 数据准备(MNIST)2. 二元分类器(SGD)3. 性能测试1. 交叉验证2. 混淆矩阵3. 查准率与查全率4. P-R 曲…...

从大专到测开,上海某字母站大厂的面试题,岗位是测开(25K*16)
简单介绍一句,大专出身,三年经验。跳了四次槽,面试了无数次,现在把自己的面试经验整理出来分享给大家,堪称必杀技! 1,一切从实际出发,对实际工作进行适当修饰 2,不会的简…...

【面试题】Python软件工程师能力评估试题(一)
文章目录前言应试者需知(一)Python 语言基础能力评估1、理解问题并完成代码:2、阅读理解代码,并在空白处补充完整代码:3、编写一个装饰器:exposer4、阅读代码并在空白处补充完整代码:5、自行用P…...
Java八股文(Java多线程面试题)
并行和并发的区别?(1)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生;(2)并行是在不同实体上的多个事件,并发是在同一实体上的多个事件&#…...

小程序当前页面如何分享别的页面内容呢?
需求分析 因为功能的需要分为两点 他需要调转转发,并且有首页转发点击button按钮进行转发邀请好友帮忙助力,如何做到一个页面多种转发 如何区分,是button转发还剩右上角三个点转发呢? 通过onShareAppMessage()这个函数的事件…...

编写Java哪个编译器好
现在能够编写Java代码的工具简直不要太多,各种各样五花八门,但目前效率最高的还是Intellij Idea。但这个工具对于完全零基础的小白来说,第一次用起来是比较复杂的,因为它的功能太多了。这就好比你要学开车,如果上来就给…...

第十六章 Java为什么使用序列化
为何要指定serialVersionUID的值如果不指定显示serialVersionUID的值,jvm在序列化时会自动生成一个serialVersionUID,跟属性一起序列化,再进行持久化或者网络传输,在反序列化时,jvm会根据属性自动生成一个新版的serial…...

28岁小公司程序员,无车无房不敢结婚,要不要转行?
大家好,这里是程序员晚枫,又来分享程序员的职场故事了~ 今天分享的这位朋友叫小青,我认识他2年多了。以前从事的是土木行业,2年前找我咨询转行程序员的学习路线和职业规划后,通过自学加入了一家创业公司,成…...

出道即封神的ChatGPT,现在怎么样了?
从互联网的普及到智能手机,都让广袤的世界触手而及,如今身在浪潮中的我们,已深知其力。前阵子爆火的ChatGPT,不少人保持观望态度。现如今,国内关于ChatGPT的各大社群讨论,似乎沉寂了不少,现在怎…...

【计算机视觉】CNN 可视化算法
文章目录一、CAM算法1.1 概述1.2 CAM算法介绍二、Grad-CAM算法2.1 概述2.2 Guided Backpropagation2.3 Occlusion Sensitivity2.4 Grad-CAM 整体结构和效果2.5 Grad-CAM 实现细节一、CAM算法 1.1 概述 本文介绍 2016 年提出的 CAM (Class Activation Mapping) 算法࿰…...
自动抓取服务器巡检、登录、执行命令记录+备份脚本
文章目录 引抓取【巡检日志】语言&时区设置语言设置时区巡检脚本执行效果抓取【登录信息】登录脚本登录脚本低版本的last命令执行效果抓取【history记录】说明配置history授权日志文件显示时间戳持久化到日志未配置history的配置过history的执行脚本执行脚本...

如何用Python求解微分方程组
文章目录odeint简介示例odeint简介 scipy文档中将odeint函数和ode, comples_ode这两个类称为旧API,是scipy早期使用的微分方程求解器,但由于是Fortran实现的,尽管使用起来并不方便,但速度没得说,所以有的时候还挺推荐…...

【微信小程序】-- 自定义组件 - behaviors(三十九)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...

【微信小程序】-- 自定义组件 - 父子组件之间的通信(三十八)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...

Java Web 实战 11 - 多线程进阶之常见的锁策略
常见的锁策略常见的锁策略1. 乐观锁 VS 悲观锁2. 普通的互斥锁 VS 读写锁3. 重量级锁 VS 轻量级锁4. 自旋锁 VS 挂起等待锁5. 公平锁 VS 非公平锁6. 可重入锁 vs 不可重入锁7. 常见面试题大家好 , 这篇文章给大家带来的是多线程中常见的锁策略 , 我们会给大家讲解 6 种类别的锁…...

(20)目标检测算法之YOLOv5计算预选框、详解anchor计算
目标检测算法之YOLOv5计算预选框、详解anchor计算 单节段目标检测算法中:预选框的设定直接影响最终的检测精度众所周知,yolov5中采用自适应调整预选框anchor的大小,但万事开头难,配置文件config中的预设还是很重要yolo算法作为on…...

3-1 SpringCloud快速开发入门: Ribbon 是什么
接上一章节Eureka 服务注册中心自我保护机制,这里讲讲Ribbon 是什么 Ribbon 是什么 通常说的负载均衡是指将一个请求均匀地分摊到不同的节点单元上执行,负载均和分为硬件负载均衡和软件负载均衡: **硬件负载均衡:**比如 F5、深信…...

Java【lambda表达式】语法及使用方式介绍
相关文章目录 第一篇: Java【EE初阶】进程相关知识 进程管理 内存管理 文章目录相关文章目录前言一、lambda表达式 是什么?1, lambda表达式 的背景2, 什么是 函数式接口3, lambda表达式 的语法二、lambda表达式 的使用方式1, 无参无返回值2, 有一个参…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...