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, 有一个参…...
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)
目录 写在前面: 题目:94. 递归实现排列型枚举 - AcWing题库 读题: 输入格式: 输出格式: 数据范围: 输入样例: 输出样例: 解题思路: 代码: AC &…...
‘conda‘不是内部或外部命令,也不是可运行的程序或批处理文件。
Anaconda环境搭建常见问题 conda不是内部或外部命令,也不是可运行的程序或批处理文件。 解决方案:配置环境变量 1.找到Anaconda Nvaigator单机右键 2.更多 3.打开文件所在位置 4.继续Anaconda Nvaigator单机右键,更多,选择文件…...
HTTP 3.0来了,UDP取代TCP成为基础协议,TCP究竟输在哪里?
TCP 是 Internet 上使用和部署最广泛的协议之一,多年来一直被视为网络基石,随着HTTP/3正式被标准化,QUIC协议成功“上位”,UDP“取代”TCP成为基础协议,TCP究竟“输”在哪里? HTTP/3 采用了谷歌多年探索的基…...
《JavaCV从入门到实战教程合集》介绍和目录
前言 《JavaCV从入门到实战教程合集》是2016年《JavaCV开发实战教程》和2018年《JavaCV入门教程》2022年《JavaCV音视频实战宝典》三合一汇总合集,完整包含JavaCV入门教程》、《JavaCV开发实战教程》系列和《JavaCV音视频实战宝典》系列所有付费内容。 《JavaCV入…...
Form Generator扩展 文本 组件
一、form-generator是什么?✨ ⭐️ 🌟 form-generator的作者是这样介绍的:Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。 但目前它提供的组件并不能满足我们在项目中的…...
【C/C++】必知必会知识点大总结
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...
【JavaScript 逆向】百度旋转验证码逆向分析
声明本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!案例目标爱企查百度安全验证百度搜索:aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS8以上均做了脱敏处理,B…...
PCL 点云投影到直线(C++详细过程版)
目录 一、算法原理二、代码实现三、结果展示1、原始点云2、投影结果一、算法原理 直线方程有三种表示法:一般式、点向式、参数式。PCL中统一采用的是点向式,直线的点向式方程为: x − x 0 m = y −...
中缀表达式转后缀表示式,及后缀表达式的运算规则
后缀表达式又称为逆波兰表达式 一,中缀表达式如何转后缀表达式 假定给出以下中缀表达式 132*2-1; 要将该表达式转为后缀表达式,我们要按照一定的规则去走,并且用到栈。 先来看规则中缀转后缀的规则: 前提&#x…...
【C++】STL简介
文章目录什么是STLSTL版本 原始版本(HP版本) P.J.版本 RW版本 SGI版本STL六大组件 容器 算法 仿函数 空间配置器 迭代器 配接器STL缺陷什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不…...
黄埭网站建设/西安网站制作价格
增加字段语法:alter table tablename add (column datatype [default value][null/not null],….); 说明:alter table 表名 add (字段名 字段类型 默认值 是否为空); 例:alter table sf_users add (HeadPIC blob); 例:alter table…...
昆山建设工程招标网站/百度下载安装2021
加措活佛-慈爱基金(jiacuo) 轮回的路上,并非都是鲜花坦途,常常会有不如意的事发生,令我们纠结于心,叹息不已。逆境是成长必经的过程,不要把境况看得那么坏,要勇于接受逆境,当困难克服了…...
兴化网站建设/广告推广怎么做最有效
知识点:掌握 appSettings 的配置与在程序中的访问 、掌握使用 connectionStrings 配置数据库连接字符串 、 掌握自定义错误信息的方法 、 掌握身份验证和权限控制 、 掌握网站的发布和部署 1、 配置文件 1.1 配置文件概述 什么是配置文件?配置文件就是具有规范化数据格式的…...
北京网站建设公司网络营销外包网络建站报价/免费网站模板网
1.Redis 事务是什么 可以一次执行多个命令,本质是一组命令的集合。一个事务中的,所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。 2.Redis 事务的作用 一个队列中,一次性、顺序性、排他性的执行…...
昆明商城网站开发/热搜榜百度
介绍 Python 作为一门相当简洁的计算机语言,目前已经拥有诸多用户。而英文的帮助文件或多或少给英语水平不太好的用户带来了一定的不便。事实上,官网就有中文手册,为了大家的方便,这里下载下来中英两种格式的PDF文件,并…...
专业网站制作公司/交换友情链接的注意事项
昨天,中国教育学会会长顾明远来杭州,参加杭州师范大学主办的第九届亚洲比较教育学会年会。会上,他对本报记者确认,全国执行高考新方案,不会在2016年,而是2017年。语文、数学在新高考里,份量加重…...