STL常见容器(set/multiset)---C++

STL常见容器目录:

  • 7. set/multiset 容器
    • 7.1 set/multiset 基本概念
    • 7.2 set构造和赋值
    • 7.3 set大小和交换
    • 7.4 set插入和删除
    • 7.5 set查找和统计
    • 7.6 set和multiset区别
      • 7.6.1 pair对组创建
      • 7.6.2 set和multiset区别
    • 7.7 set容器排序
      • 7.7.1 内置数据类型
      • 7.7.2 自定义数据类型

在这里插入图片描述

7. set/multiset 容器

7.1 set/multiset 基本概念

简介:

  • 所有元素都会在插入时自动被排序.

本质:

  • set/multiset属于关联式容器,底层结构是用二叉树实现。

set和multiset区别

  • set不允许容器中有重复的元素
  • multiset允许容器中有重复的元素

注意:
multiset容器与set容器基本一致,两者头文件都是#include ;
下面着重介绍set容器。

7.2 set构造和赋值

功能描述:创建set容器以及赋值

构造:

  • set<T> st; //默认构造函数:
  • set(const set &st); //拷贝构造函数

赋值:

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

示例:

void printSet(set<int> & s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//构造和赋值
void test01()
{
	set<int> s1;

	s1.insert(10);//插入数据仅有insert
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);
	printSet(s1);
}

输出:

10 20 30 40

总结:

  • set容器插入数据时用insert
  • set容器插入数据的数据会自动排序

7.3 set大小和交换

功能描述:

  • 统计set容器大小以及交换set容器

函数原型:

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器

7.4 set插入和删除

功能描述:

  • set容器进行插入数据和删除数据

函数原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。(删除的是排序后的位置上的数据)
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(elem); //删除容器中值为elem的元素。

7.5 set查找和统计

功能描述:

  • 对set容器进行查找数据以及统计数据

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
  • count(key); //统计key的元素个数(0或1)

示例:

#include <set>
void test01()
{
	set<int>s;

	s.insert(4);
	s.insert(1);
	s.insert(3);
	s.insert(2);

	set<int>::iterator pos = s.find(3);
	if (pos != s.end())
	{
		cout << "找到了元素 : " << *pos << endl;
	}
	else
	{
		cout << "未找到元素" << endl;
	}

	int num1 = s.count(30);//0或1
	cout << "num1 = " << num1 << endl;
	int num2 = s.count(2);//0或1
	cout << "num2 = " << num2 << endl;
}

输出:

找到了元素 : 3
num1 = 0
num2 = 1

总结:

  • 查找 — find (返回的是迭代器)
  • 统计 — count (对于set,结果为0或者1)

7.6 set和multiset区别

7.6.1 pair对组创建

功能描述:

  • 成对出现的数据,利用对组可以返回两个数据.

两种创建方式:

  • pair<type, type> p ( value1, value2 );
  • pair<type, type> p = make_pair( value1, value2 );

示例:

class Person
{
public:
	Person(string name)
	{
		this->m_name = name;
	}

	string m_name;
};
void test02()
{
	pair<string, int>p1("Marry", 18);
	//first和second表示pair中的第一第二个参数
	cout << "姓名: " << p1.first << " 年龄: " << p1.second << endl;

	Person person("孙悟空");//自定义类型
	pair<Person, int> p2 = make_pair(person, 9999);
	cout << "姓名: " << p2.first.m_name << " 年龄: " << p2.second << endl;
}

输出:

姓名: Marry 年龄: 18
姓名: 孙悟空 年龄: 10

7.6.2 set和multiset区别

区别:

  • set不可以插入重复数据,而multiset可以;
  • set插入数据的同时会返回插入结果,表示插入是否成功
  • multiset不会检测数据,因此可以插入重复数据。

对于set容器的insert,在VS中点击insert——右击——转到定义,如下
在这里插入图片描述
可看出,insert返回值是一个pair对组(两个参数:迭代器:插入的数据的位置、bool类型:是否插入成功),

示例:

void test03()
{
	//set
	set<int>s;
	pair<set<int>::iterator,bool> flag= s.insert(99);
	if (flag.second)
	{
		cout << "第一次插入成功 " << endl;
	}
	else
	{
		cout << "第一次插入失败" << endl;
	}

	flag= s.insert(99);//重复插入
	if (flag.second)
	{
		cout << "第二次插入成功 " << endl;
	}
	else
	{
		cout << "第二次插入失败" << endl;
	}

	//multiset
	multiset<int> ms;
	ms.insert(10);
	ms.insert(10);//重复插入

	for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

输出:

第一次插入成功
第二次插入失败
10 10

总结:

  • 如果不允许插入重复数据可以利用set;
  • 如果需要插入重复数据利用multiset。

7.7 set容器排序

主要技术点:

  • 利用仿函数,可以改变排序规则.

7.7.1 内置数据类型

示例一:

//仿函数
class MyCompare
{
public:

	bool operator()(const int& v1,const int& v2) const
	{
		return v1 > v2;
	}
};

void PrintSet(set<int> s1)
{
	for (set<int, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test04()
{
	set<int> s1;
	s1.insert(10);
	s1.insert(40);
	s1.insert(20);
	s1.insert(30);
	s1.insert(50);
	//默认从小到大 升序
	PrintSet(s1);
	

	//指定排序规则 降序
	//<>内为数类型,不可放置函数名
	set<int, MyCompare> s2;//改变排序顺序需要在插入数据之前改变
	s2.insert(10);
	s2.insert(40);
	s2.insert(20);
	s2.insert(30);
	s2.insert(50);

	//PrintSet(s2);//插入仿函数后,打印函数的形参类型为set<int,MyCompare>s1
	/*for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;*/

	for (auto it = s2.begin(); it != s2.end(); it++) {
		cout << *it << " ";
	}
}

输出:

10 20 30 40 50
50 40 30 20 10

7.7.2 自定义数据类型

示例二:

class Person
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	string m_Name;
	int m_Age;

};
//仿函数
class MyCompare
{
public:

	bool operator()(const Person& v1,const Person & v2) const
	{
		按照年龄进行排序  升序
		return v1.m_Age < v2.m_Age;
	}
};

void test05()
{

	//指定排序规则 
	//<>内为数类型,不可放置函数名
	set<Person, MyCompare> s2;//改变排序顺序需要在插入数据之前改变
	
	//插入自定义数据:只需类型+参数
	s2.insert(Person ("刘备", 23));
	s2.insert(Person ("关羽", 27));
	s2.insert(Person ("张飞", 25));
	s2.insert(Person ("赵云", 21));


	for (auto it = s2.begin(); it != s2.end(); it++) {
		cout << "姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl ;
	}
}

输出:

姓名:赵云 年龄:21
姓名:刘备 年龄:23
姓名:张飞 年龄:25
姓名:关羽 年龄:27

总结:

对于自定义数据类型,set必须指定排序规则才可以插入数据.

欢迎评论区留言与我交流!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录 关于navicat连接数据库报错1045的问题

重装数据库之后就连接不上了 报错1045 而网上的解决方案大都是更改数据库密码&#xff0c;但是我在第一步就被卡住无法更改密码&#xff0c;输入指令也报错&#xff0c;检查的环境变量也没错&#xff0c;经过长时间的试错终于找到解决了办法 解决办法 删除data文件夹 如果无法…

吸引用户购买产品的文案技巧,媒介盒子揭秘

在营销过程中&#xff0c;想要吸引用户购买产品&#xff0c;文案是重中之重&#xff0c;需要一定的技巧才能将文案写好&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;在品牌推广中如何通过一些小技巧吸引用户购买产品&#xff1a; 一、 少说专业术语 少说行话、黑话。多…

如何选择合适的幻兽帕鲁服务器CPU核心数和内存大小,避免丢包和延迟高?

根据幻兽帕鲁服务器的实际案例分析选择合适的CPU核心数和内存大小以避免丢包和延迟高&#xff0c;首先需要考虑的是服务器的性能需求。幻兽帕鲁服务器推荐使用4核CPU和16GB内存&#xff0c;建议使用32GB以上的内存才能稳定运行。这表明对于幻兽帕鲁这样的游戏服务器来说&#x…

2024有哪些免费的mac苹果电脑深度清理工具?CleanMyMac X

苹果电脑用户们&#xff0c;你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅&#xff1f;可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻&#xff0c;拥有一些高效的深度清理工具就显得尤为重要。今天&#xff0c;我将介绍几款优秀的苹果电脑深度清理工具…

(done) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵

参考视频1&#xff1a;https://www.bilibili.com/video/BV1H64y1T7zQ/?spm_id_from333.337.search-card.all.click 参考视频2&#xff08;正定矩阵&#xff09;&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_…

关于vue中关于eslint报错的问题

1 代码保存的时候会自动将单引号报错为双引号 导致eslint报错的问题&#xff0c; 解决思路&#xff1a; 在项目根目录下新建一个.prettierrc.json文件 { “tabWidth”: 2,“useTabs”: false,“singleQuote”: true,“semi”: false} 2 关于报错代码的时候 出现尾随逗号报错…

继承-学习2

this关键字&#xff1a;指向调用该方法的对象&#xff0c;一般我们是在当前类中使用this关键字&#xff0c;所以我们常说代表本类对象的引用 super关键字&#xff1a;代表父类存储空间的标识(可看作父类对象的引用) 父类&#xff1a; package ven;public class Fu {//父类成员…

WhatsApp代理設置指南

某些情況下&#xff0c;你可能需要使用WhatsApp代理來確保WhatsApp順暢且不受限制的通信。本篇文章將講解WhatsApp代理是什麼、WhatsApp代理的使用場景、以及如何在WhatsApp中使用和設置代理。​​​​​​​ WhatsApp代理指什麼? WhatsApp代理是位於可以訪問WhatsApp的國家或…

AtCoder Beginner Contest 341

C - Takahashi Gets Lost 分析&#xff1a;数据小&#xff0c;暴力没什么好说的 int h,w,n; string t; char c[505][505]; int dx[4]{1,-1,0,0}; int dy[4]{0,0,1,-1}; int get(char c){if(cL)return 3;if(cU)return 1;if(cR)return 2;return 0; } int check(int x,int y,int …

ensp路由器将不同网络连通在一起

1.拓扑结构信息如下 二层交换机&#xff1a;lsw2,lsw3,lsw5,lsw6 不进行ip配置&#xff0c;只是定义vlan&#xff0c;和主机标注的保持一致&#xff0c;向下连接pc用access&#xff0c;向上连接路由交换机用trunk lsw2配置信息如下图 定义vlan&#xff0c;设置各个连接口的方式…

如何进行弱网测试?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 如今这个高度互联的时代里&#xff0c;网络环境对于应用程序的影响越来越重要。 而弱网测试就是…

SpringMVC 学习(七)之报文信息转换器 HttpMessageConverter

目录 1 HttpMessageConverter 介绍 2 RequestBody 注解 3 ResponseBody 注解 4 RequestEntity 5 ResponseEntity 6 RestController 注解 1 HttpMessageConverter 介绍 HttpMessageConverter 报文信息转换器&#xff0c;将请求报文&#xff08;如JSON、XML、HTML等&#x…

Biotin aniline,生物素苯胺,用于研究蛋白质结构和功能

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;769933-15-5&#xff0c;Biotin aniline&#xff0c;生物素苯胺&#xff0c;Biotin-aniline&#xff0c;生物素-苯胺 一、基本信息 【产品简介】&#xff1a;Biotin aniline is composed of three parts: biotin, w…

【会议征稿通知】第十届人文学科与社会科学研究国际学术会议(ICHSSR 2024)

第十届人文学科与社会科学研究国际学术会议&#xff08;ICHSSR 2024) 2024 10th International Conference on Humanities and Social Science Research 第十届人文学科与社会科学研究国际学术会议&#xff08;ICHSSR 2023)将于2024年4月26-28日在中国厦门隆重举行。会议主要…

RabbitMQ的常见工作模式

Work queues 工作队列模式 模式说明 通过Helloworld工程我们已经能够构建一个简单的消息队列的基本项目&#xff0c;项目中存在几个角色:生产 者、消费者、队列&#xff0c;而对于我们真实的开发中 &#xff0c;对于消息的消费者通过是有多个的。 比如在实现用户注册功能时&…

Apache Calcite 一条 SQL 的查询计划生成之旅【上】

作者&#xff1a;沈磊&#xff08;LakeShen&#xff09;&#xff0c;公众号&#xff1a;雷克分析 背景 Apache Calcite 作为一款开源的动态数据管理框架&#xff0c;由于其模块化、可扩展、以及不和任何计算引擎绑定的特性&#xff0c;目前在开源项目和商业化产品中已得到广泛…

Cesium 自定义Primitive

1、为什么要自定义Primitive a、在飞机飞行过程中&#xff0c;如果使用entity同时绘制飞机和线的时候&#xff0c;会发现飞机的飞行位置和线的位置不统一&#xff0c;出现差距&#xff0c;出现脱线。 b、结合代码分析&#xff0c;cesium的线和飞机模型是分开渲染的&#xff0c;…

跨境电商与支付介绍

1、跨境电商定义和分类&#xff1b; 2、国际贸易清结算&#xff1b; 3、跨境支付&#xff1b; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同&#xff0c;交易双方属于不同的国家。因此&#xff0…

LaMa Image Inpainting 图像修复 ONNX Runtime Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

C++——友元

目录 友元 友元函数 友元函数使用案例 友元类 友元 友元是C提供的一种突破封装&#xff08;突破类域&#xff09;的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;但破坏了封装&#xff0c;所以友元不宜多用。友元分为友元函数和友元类。 友元函数 友元…