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

news2024/11/18 7:45:05

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必须指定排序规则才可以插入数据.

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React中对表格实现列表的拖拽排序

1. 效果:推拽手柄列 2. 实现: react中我们需要两个包来实现 ‘array-move’‘react-sortable-hoc’Installation Use npm $ npm install react-sortable-hoc --save 引入 import { arrayMoveImmutable } from array-move import { SortableContainer, SortableElement, Sort…

智能汽车软硬件产品CES展示汽车技术新亮点

智能汽车是汽车产业发展的新趋势&#xff0c;是未来汽车发展的必然方向。智能汽车是指搭载了先进的传感器、控制器、执行器等部件&#xff0c;并融合了人工智能、自动驾驶等技术&#xff0c;能够实现部分或完全自动驾驶、智能网联等功能的汽车。 近年来&#xff0c;智能汽车技…

CDN原理探究

来源于百度&#xff1a; https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C/4034265?frge_ala 通过上图&#xff0c;我们可以了解到&#xff0c;使用了CDN缓存后的网站的访问过程变为&#xff1a; 用户向浏览器提供要访问的域名&#xff…

基于springboot实现的健康监控管理系统

一、系统架构 前端&#xff1a;html | bootstrap | jquery | css 后端&#xff1a;springboot | thymeleaf | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 体检测评 02. 运动处方 03. 运动处方明细 04. 运动处方-打卡…

css常用的选择器介绍

CSS&#xff08;层叠样式表&#xff09;选择器是CSS规则的一部分&#xff0c;它用于选择和定位网页上的元素&#xff0c;以便将样式应用到这些元素上。CSS选择器的种类繁多&#xff0c;每种选择器都有其特定的用途、特点和效率。在这篇文章中&#xff0c;我们将讨论一些常用的C…

oracle11安装及使用

安装oracle11 可访问我的资源 也可以网盘获取 链接&#xff1a;https://pan.baidu.com/s/1RDrGkqDA7tfKRnpJXUBMDw 提取码&#xff1a;z3na 上传安装包到服务器 在指定目录下创建文件夹installfile&#xff0c;我是在/newdisk/oracle/installfile&#xff0c;将安装文件…

数码管静态显示(一)

1.原理 计数0.5S&#xff0c;一个时钟周期20ns&#xff0c;因此要计数0.5s就是要从0计数到24999_999。 级联两个芯片可以实现16位得串并转换 MR是主复位端口&#xff0c;横线表示低电平有效。通常接到vcc&#xff0c;防止数据得清零。DS输入数据&#xff0c;SHCP输入时钟&#…

C#,动态规划(DP)金矿问题(Gold Mine Problem)的算法与源代码

1 金矿问题&#xff08;Gold Mine Problem&#xff09; 给定一个N*M尺寸的金矿&#xff0c;每个点都有一个非负数表示当前点所含的黄金数目&#xff0c;最开始矿工位于第一列&#xff0c;但是可以位于任意行。矿工只能向右&#xff0c;右上&#xff0c;右下三个方向移动。问该…

CTFHub技能树web之XSS

在XSS系列的题目中&#xff0c;由于需要使用能够接受XSS数据的平台&#xff0c;并且由于使用的是CTFHub的模拟机器人点击我们的虚假URL&#xff0c;因此使用的XSS平台不能是自己本地搭建的&#xff0c;如果是本地的模拟点击的机器人将无法访问我们给的这个URL地址&#xff0c;也…

【前端素材】推荐优质在线通用果蔬商城电商网页eStore平台模板(附源码)

一、需求分析 1、系统定义 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。它将不同种类的新鲜水果、蔬菜、干果、坚果等聚集在一起&#xff0c;为消费者提供方便、快捷的购物渠道。 2、功能需求 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。…

u盘文件损坏怎么恢复数据?分享3个U盘数据恢复方法

在现代生活中&#xff0c;U盘作为一种便携式存储设备&#xff0c;已经广泛地应用于工作和生活的各个方面。然而&#xff0c;无论是由于硬件故障、病毒感染还是不当操作&#xff0c;U盘中的数据都有可能遭受损坏或丢失。面对这种情况&#xff0c;如何有效地恢复U盘中的文件成为了…

openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述

文章目录 openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述231.1 功能描述231.2 相关概念**231.2.1 资源管理****231.2.2 控制组****231.2.3 资源池** openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述 231.…

Linux系统——Nginx负载均衡模式

目录 一、Nginx优点 二、Nginx配置项——Conf Upstream 模块 三、Nginx负载均衡 1.负载均衡策略 1.1轮询 1.2IP_hash 1.3URL_hash 1.4Least_conn 1.5Weight 1.6Fair 2.Nginx负载均衡配置状态参数 3.什么是会话保持 3.1会话保持有什么作用呢 3.2Nginx会话保持 3…

果园预售系统|基于Springboot的果园预售系统设计与实现(源码+数据库+文档)

果园预售系统目录 目录 基于Springboot的果园预售系统设计与实现 一、前言 二、系统功能设计 三、系统功能设计 1 、果园管理 2、水果管理 3、果树管理 4、公告管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

“智农”-高标准农田

高标准农田是指通过土地整治、土壤改良、水利设施、农电配套、机械化作业等措施&#xff0c;提升农田质量和生产能力&#xff0c;达到田块平整、集中连片、设施完善、节水高效、宜机作业、土壤肥沃、生态友好、抗灾能力强、与现代农业生产和经营方式相适应的旱涝保收、稳产高产…

Unity(第十六部)声音和视频

声音 1、听声音 创建相机的时候&#xff0c;相机自带Audio Listener 多个相机的时候&#xff0c;我们只保留一个Audio Listener就可以 2、声音源&#xff0c;环境音 添加Audio Source就行中文叫声音源 3、脚本执行的声音 using System.Collections; using System.Collection…

【OpenGL的着色器03】内置变量(gl_Position等)

目录 一、说明 二、着色器的变量 2.1 着色器变量 2.2 着色器内置变量 三、最常见内置变量使用范例 3.1 常见着色器变量 3.2 示例1&#xff1a; gl_PointSize 3.3 示例2&#xff1a;gl_Position 3.4 gl_FragColor 3.5 渲染点片元坐标gl_PointCoord 3.6 gl_PointCoo…

使用 Helm 安装 极狐GitLab

本篇作者 徐晓伟 使用 Helm 简便快捷的部署与管理 极狐GitLab 前提条件 k8s 完成 helm 的配置 k8s 完成 ingress 的配置 内存至少 10G 演示环境是 龙蜥 Anolis 8.4&#xff08;即&#xff1a;CentOS 8.4&#xff09;最小化安装k8s 版本 1.28.2calico 版本 3.26.1nginx ingre…

继续预训练对大语言模型的影响

翻译自文章&#xff1a;Investigating Continual Pretraining in Large Language Models: Insights and Implications 摘要 本文研究了大型语言模型&#xff08;LLMs&#xff09;中不断学习&#xff08;CL&#xff09;的不断发展领域&#xff0c;重点是制定有效和可持续的训练…

数据库分库分表中间件选择

目前分库分表的中间件有三种设计思路&#xff0c;分别是&#xff1a; 采用分散式架构&#xff0c;适用于用Java开发的高性能轻量级OLTP应用程序&#xff0c;以Sharding-JDBC为代表。采用中间层Proxy架构&#xff0c;提供了静态输入和所有语言支持&#xff0c;适用于OLAP应用程…