STL学习笔记05-set / multiset容器

C++ 107 之 set容器 我们可以通过set的迭代器改变set元素的值吗?不行,因为set元素值就是其键值,关系到set元素的排序规则。set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。删除pos迭代器所指的元素,返回下一个元素的迭代器。 阅读详情

1. set容器

1、set容器简介

set 容器是存储排序键的关联式容器,set容器底层结构是用二叉树实现的。
set容器会自动根据键的大小对存储的键值对进行排序(默认升序),根据 key 排序,也就等价为根据 value 排序。
set 容器中每个键都是唯一的,可以插入或删除但不能修改,因为修改很有可能破坏 set 容器中元素的有序性。

  • set容器内不允许有重复的元素(mult)
  • set容器中的元素是有序排列的(升序)

2.set容器的构造和赋值

//默认构造,
set<int> s1;
//在构造容器时还可以对容器进行初始化
set<int> s2{4,6,3,7,2};
//拷贝构造函数
set(const set &st) ,将已有 set 容器中存储的所有元素全部拷贝到新 set 容器中
set<int> s3(s2);	//等同于赋值//set<int> s3 = s2

//重载等号操作符
set& operator=(const set &st);//

3.set容器的大小和交换

1.size()	返回当前 set 容器中元素的个数。
2.empty()	判断容器是否为空,为空则返回 true;否则 false。
3.swap()	交换 2 个 set 容器中存储的所有元素,这 2 个 set 容器的类型必须相同。

4、set容器的添加与删除

1. insert(val)	向 set 容器中添加元素。
2. clear()	清空 set 容器中所有的元素,即令 set 容器的size() 为 0。
3.erase(pos)	删除pos位置上的元素,返回下一个元素的迭代器。
4.erase(beg,end)	删除区间[ beg,end ) 的元素,返回下一个元素的迭代器。
5.erase(elem)	删除容器中元素为elem的元素。

5.set容器的查找与统计

1.find(val)	在 set 容器中查找值为 val 的元素,如果成功找到,则返回指向该元素的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
2.count(val)	在当前 set 容器中,查找值为 val 的元素的个数,并返回。注意,由于 set 容器中各元素的值是唯一的,因此该函数的返回值最大为 1,找到为1,找不到为0,在multiset中值可大于1。

6.pair类模板

pair(对组)将一对值组合成一个值,利用对组可以返回两个数据。
这一对值可以具有不同的数据类型(T1和T2)。
两个值可以分别用pair的两个公有函数first和second访问。

创建pair对组的方式

pair(); 默认构造函数
pair<type,type> p( value1,value2); 直接使用 2 个元素初始化成 pair 对象
pair(const pair<U,V>& pr) 拷贝(复制)构造函数
pair<type,type> p = make_pair(value1,value2);

测试案例:

#include<iostream>
using namespace std;
#include<string>

void test01() {

	pair<string, int> p1;

	pair<string, int> p2("张三", 18);
	cout << "姓名:" << p2.first << " 年龄:" << p2.second << endl;

	pair<string, int> p3 = make_pair("李四", 36);
	cout << "姓名:" << p3.first << " 年龄:" << p3.second << endl;

	pair<string, int> p4(p3);
	cout << "姓名:" << p4.first << " 年龄:" << p4.second << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

7、set和multiset的区别

  • set不可以插入重复的元素,multiset可以插入重复的元素
  • set插入元素的同时会返回插入结果,表示插入是否成功(成功ret.second=true,失败为false)
  • multiset不会检测数据,因此可以插入重复数据
#include<iostream>
using namespace std;
#include<set>

void test01() {

	set<int> s1;
	pair<set<int>::iterator, bool> res = s1.insert(10);
	if (res.second) {
		cout << "第一次插入成功" << endl;
	}
	else {
		cout << "第一次插入失败" << endl;
	}
	res = s1.insert(10);
	if (res.second) {
		cout << "第二次插入成功" << endl;
	}
	else {
		cout << "第二次插入失败" << endl;
	}
	multiset<int> s2;
	s2.insert(10);
	s2.insert(10);
	cout << "容器s2的元素数目" << s2.size() << endl;
	int num1 = s1.count(10);
	int num2 = s2.count(10);
	cout << "容器s1中元素10的数目为" << num1 << endl;
	cout << "容器s2中元素10的数目为" << num2 << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

8、set容器的排序

set容器默认是升序排序,利用仿函数,可以改变排序规则

#include<iostream>
using namespace std;
#include<set>
#include<string>

class MyCompare {
public:
	bool operator()(int v1, int v2) const {
		return v1 > v2;
	}
};
void test01() 
{
	//创建容器时指定排序规则
	set<int, MyCompare> s1{ 10 ,20 ,50,30};
	for (set<int, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
class Person {
public:
	Person(string name, int age) {
		this->m_Name = name;
		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};

//自定义数据类型,需要自己指定排序规则
class MyCompare2 {
public:
	bool operator()( Person p1,  Person p2)const  
	{
		return p1.m_Age > p2.m_Age;
	}
};
void test02() {
	set<Person, MyCompare2> s1();
	Person p1("张三", 32);
	Person p2("关羽", 42);
	Person p3("刘备", 50);
	Person p4("赵云", 22);
	s1.insert(p1);
	s1.insert(p2);
	s1.insert(p3);
	s1.insert(p4);
	for (set<Person, MyCompare2>::iterator it = s1.begin(); it != s1.end(); it++) {
		cout << "姓名: " << (*it).m_Name << " 年龄:" << (*it).m_Age << endl;
	}
}
int main() {
	test01();
	test02();
	system("pause");
	return 0;
}

k-Wave仿真例程:创建超声换能器并绘制声场分布 k-Wave软件是为了模拟超声波在1D、2D或3D中的传播。应用示例包括:- 均匀和非均匀介质中的传播- 模拟各种类型的传感器- 模拟多普勒效应- 衍射、折射和反射- 光声、超声成像- 波束合成、成像重建- 模拟弹性波。 阅读详情

相关推荐

PID算法(位置式pid算法和增量式pid算法)

PID 算法是闭环控制系统中常用的算法,PID 分别是 Proportion(比例)、Integral(积分)、Differential(微分)的首字母缩写。它是一种结合比例、积分和微分三个环节于一体的闭环控。

m0_57678852的博客 2万+

C++ STL标准库:std::set std::multiset初始化、插入元素insert()的使用

#include <iostream> #include <set> using namespace std; void OutPut(set<int> &s) { set<int>::iterator it; for(it=s.begin();it!=s.end();it++) cout<<" "<<*it<<", "; cout<<endl; } void OutPutM(mult

超级大洋葱的博客 3007

MATLAB绘图中文乱码终极解决方案:从方框到清晰显示的全面指南

本文提供了MATLAB绘图中文乱码的全面解决方案。针对中文显示为方框的问题,从单次绘图的临时字体设置,到通过修改默认配置实现一劳永逸,再到系统级字体排查与Java环境配置,给出了详细的步骤指南。文章还涵盖了字体名称指定、图像导出防丢失以及跨平台协作等高级技巧,帮助用户彻底解决中文乱码困扰。

weixin_29093017的博客 616

STL set、map、priority_queue默认排序

set set<T> s;//默认升序,相当于 set<int,less<T>>。 set<T, less<T>> s; //该容器是按升序方式排列元素。 set<T, greater<T>> s; //该容器是按降序方式排列元素。 map map<T1, T2> m;//默认按键的升序方式排列元素,相当于 map<T1, T2, less<T1>> m map<T1, T2,

qq_42080098的博客 1005

XTDrone平台FAST-LIO2与ego-planner结合路径规划部署

之前做了XTDrone平台FAST-LIO2的部署现在将其结合ego-planner进行导航规划,之前查看教程是使用视觉进行定位导航的,现在重新学习。修改advanced_param_xtdrone.xml,这里有视觉信息,不修改会报错显示为输入视觉话题信息。怎么描述 ,感觉当时觉得很难的问题突然就给解决了,一顿复杂,最近勤更新吧,继续开始学习。还有一个想法就是两个rviz结合在一起启动,写了一个demo,融合的不太好感觉额。改为只使用雷达点云,这里仿真的话题是/scan。

m0_56093217的博客 1083

大数据在电力行业的应用案例解析-【电力技术】(九)大数据在电力储能运维中的深度应用(含故障预测代码)

大数据技术为电力储能运维提供了“精准化、智能化、高效化”的解决方案,破解了传统运维的核心痛点,实现了储能系统从“被动抢修”到“主动运维”的转型,为新型电力系统建设提供了重要支撑。当前,随着储能产业的快速发展,大数据与储能运维的融合将更加深入,未来将结合人工智能、物联网、区块链等技术,实现储能运维的全流程智能化——从设备故障的提前预警,到寿命的精准预测,再到运维策略的自动优化、调度协同的实时响应,进一步提升储能系统的安全性、经济性与可靠性。

getusushu的博客 88

8、SoctedSet类型(是一个可排序的set集合(默认升序,每个元素都带有score分数属性)和java的TreeSet类似(都可排序的set集合),但结构有差异)

SoctedSet类型(是一个可排序的set集合(默认升序,每个元素都带有score分数属性)和java的TreeSet类似(都可排序的set集合),但结构有差异) 命令: 案例: 操作:1、其存入默认为升序存入(其写法是key score member) 2、 3、ZRank(排名嘛rank) 4、统计数量zcount 5、zincrby(自增嘛increment) 6、将升序变为倒叙再查(查信息嘛range) 6、 上机实践

分享JAVA/ Python/ Ts学习路上的一些笔记,不足之处多多见谅。 162

秋叶ComfyUI整合包使用FRP实现公网访问教程 ComfyUI内网穿透 秋叶整合包

最近在做 ComfyUI 的实验时,我发现很多小伙伴都遇到一个问题:本地启动的 ComfyUI 服务只能在本地访问,想要通过公网远程访问,就必须借助来实现。作为一名前端开发工程师,我花了点时间把 ComfyUI 启动器和 FRP 配置整合了一下,今天就分享给大家。本文适合已经了解。需要注意的是 穿透到公网的话任何人都能访问 为了安全建议看我另一篇帖子加上密码验证 防止恶意攻击。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1349

C++ set用法总结(整理)

http://www.cplusplus.com/reference/set/set/insert/ 顺序容器包括vector、deque、list、forward_list、array、string,所有顺序容器都提供了快速顺序访问元素的能力。 关联容器包括set、map 关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中...

sevenjoin的博客 13万+

芯擎SEC1000芯片参数详细介绍

随着龙鹰一号的不断进化和应用,未来的智能座舱将不仅仅是显示和控制的集成,更是人与车之间的一种默契和无缝交互的体现。在汽车行业迈向智能化和电动化的浪潮中,座舱已不仅仅是一个驾驶者的操作空间,而是逐渐演变为一个集娱乐、信息、控制于一体的智能交互平台。今天的汽车不仅需要强劲的动力和炫酷的外观,更需要一颗强大而智能的“心脏”来支撑复杂的座舱体验和安全驾驶需求。想象一下,未来的汽车不再仅仅是交通工具,它将成为你的移动私人管家,了解你的习惯,甚至提前预测你的需求。让我们一起走进龙鹰一号的世界,探索智能座舱的无限可能!

weixin_43199439的博客 1725

基于Vivado MIG IP核的DDR3读写实验(top_rom_ddr/ddr_top)

一、前言 关于Vivado MIG IP核详细配置可以参考我之前的文章:基于Vivado MIG IP核的DDR3控制器(DDR3_CONTROL) 关于MIG IP核的用户端的接口时序可以参考这篇文章:XILINX 的 MIG IP(非AXI4)接口时序以及控制 二、实验内容 本次实验的内容主要是通过MIG IP核向DDR3读写数据,DDR3的接口时序由ddr_top模块提供: ddr_top模块的数据来源是wr_fifo,wr_fifo的数据实际来自top_sd_photo模块(本实验仿真

耐心的小黑的博客 3027

std::set用法

std::set成员函数及简要使用方法函数 声明 说明insert pair insert(const value_type& x) iterator insert(iterator position, const value_type& x) 1、向集合中添加一个元素 2、在迭代器指向的位置上放置指定的元素count size_type count(const key_typ

baund的专栏 6万+

【unity小技巧】常用的方法属性和技巧汇总(长期更新,2025/07/02更新)

Unity开发技巧摘要 本文汇总了Unity开发中的实用技巧,包括移动控制、力应用、物体翻转、单例模式实现等。移动方面介绍了MoveTowards、MovePosition、Translate等方法的区别与应用场景;力应用部分详解了AddForce系列方法的参数和使用方式;物体翻转对比了三种实现方案;单例模式提供了标准实现和泛型优化版本;还收录了绝对值计算、鼠标检测、旋转控制、数值取整等实用代码片段。这些经过验证的技巧能有效提升开发效率,文章将持续更新补充新的实用内容。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3349

STL常用容器- set/ multiset 容器

任何节点最多只允许有两个子节点,分别是左子节点和右子节点set容器插入数据时用insertset容器插入数据的数据会自动排序统计大小 --- size判断是否为空 --- empty交换容器 --- swap插入 --- insert删除 --- erase清空 --- clear查找 --- find (返回的是迭代器)统计 --- count (对于set,结果为0或者1)如果不允许插入重复数据可以利用set如果需要插入重复数据利用multiset。

m0_74380601的博客 3008

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++ set、map、multiset和multimap容器

本文将重点探几种种基于树形结构的关联式容器set、multiset、map和multimap。这这四种容器在C++标准库中占据着重要地位,它们不仅提供了强大的数据存储和检索功能,还各自具备独特的特性,如自动排序、键值对的存储以及多键值的支持。接下来,我们将详细介绍他们的特性和用法,帮助读者更好地理解和运用树形结构关联式容器。集合是按照特定顺序存储唯一元素的容器。在set中,元素的值也标识它(值本身就是键,类型为T),并且每个值必须是唯一的。set中元素的值在容器中。

2301_79171011的博客 1198

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

set/multiset容器

set容器基本概念

2302_78279100的博客 1116

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STL之set容器代码详解

所有元素都会在插入时自动被排序set/multiset属于,底层结构是用实现。set不允许容器中有重复的元素;multiset允许容器中有重复的元素。

马上到我碗里来的博客 1143

C++ STL set (集合)& multiset(多重集合) 学习笔记(带点不正经的幽默讲解版)

【搞笑版C++ set/multiset速成指南】 set是"渣男黑名单"——自动去重+排序,拒绝重复值;multiset是"海王通讯录"——允许重复但依然有序。两者底层都是红黑树,查找效率O(logn)。 主要操作: 构造:可用初始化列表 set<int> s={3,1,2} 插入:insert(val)(set会忽略重复值) 删除:erase(val)或迭代器删除 查找:find(val)返回迭代器,count(val)统计出现次数(set只会返回0或

qq_63683271的博客 941

STL标准模板库超详细讲解(栈,队列)

STL容器是用于存储数据的类,‌包括向量(‌vector)‌、‌双端队列(‌deque)‌、‌表(‌list)‌、‌队列(‌queue)‌、‌堆栈(‌stack)‌、‌集合(‌set)‌、‌多重集合(‌multiset)‌、‌映射(‌map)‌和多重映射(‌multimap)‌等。‌每种容器都有其独特的特点和适用场景,‌例如,‌向量适合频繁访问元素且可能在尾部进行大量插入和删除操作的场景,‌而集合则用于存储不重复的元素。‌

LiXinLong_LXL_13的博客 2076

集合set/multiset容器部分API总结

1.set容器是一种关联式容器,在插入数据时会根据键值进行排序,不允许出现重复的键值。 2.set容器不能通过迭代器来修改键值,其迭代器不支持随机访问. 3.multiset允许键值重复 #include&lt;iostream&gt; #include&lt;set&gt; //set 或 multiset #include&lt;string&gt; using namespace...

weixin_43971252的博客 333

【C++】set/multiset 容器的基操

set/multiset 容器 set基本概念 所有元素都会在插入时自动被排序 set/multiset属于关联式容器,底层结构是用二叉树实现 set个multiset区别: set不允许容器中有重复元素 multiset允许容器中有重复元素 set构造和赋值 /* set构造和赋值 有序不可重复 set<T> name; 默认构造函数 set(const set& name); 拷贝构造函数 set& operator=(const set& n

宫瑞阳的博客 238

C++阶段05笔记04【C++提高编程资料(queue容器、list容器、set/multiset容器、map/multimap容器)】

C++阶段05笔记04【C++提高编程资料(queue容器、list容器、set/multiset容器、map/multimap容器)】

upward 478

[C++] STL (multi)map/(multi)set简介

容器类型在之前,我们已经接触过STL中的部分容器,比如vector,list,queue等。这些容器有一个共同的特点,他们都是序列式容器,因为其底层为线性序列的数据结构,并且里面存储的是数据本身,与关联式容器式不同的。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value结构的键值对,在数据检索时比序列式容器效率更高。键值对用来表示对应关系的一种结构,这个结构中一般包含两个成员变量,key和value。key表示键值;value表示与key对应的信息。

石墨博客 1251

set、map、multiset、multimap的介绍及使用以及区别,注意事项

set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。

2301_81265915的博客 1095

【STL】09. 详解标准库中的 set 和 map

对标准库中set和map的接口函数进行讲解

caryon的博客 1121

STL容器运用练习

string #include <iostream> #include <string> #include <algorithm> using namespace std; //1 初始化 void test01() { string s1 = "aaaaaa"; string s2("bbbbbb"); string s3 = s2; string...

$慕雪$的博客 448
上一篇: STL学习笔记04-stack,queue,list容器
下一篇: STL学习笔记06-map/ multimap容器
SMH_壹壹贰
博客等级 码龄7年 17粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值