第九层(8):STL之set/multiset

news2024/11/15 13:24:28

文章目录

  • 前情回顾
  • set/multiset
    • 概念
    • 区别
    • 构造函数
    • 赋值函数
    • 大小操作函数
    • 交换函数
    • 插入函数
    • 删除函数
    • 查找函数
    • 统计函数
    • 为什么set不可以插入重复数据
      • pair数组
        • pair数组创建
    • 怎么样去改变set容器的排序规则
  • 下一座石碑

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前情回顾

在上一块石碑中,我学到了,同时下一块石碑也显露出来…

  • 🚄上章地址:第九层(7):STL之list

set/multiset

概念

  • 所有插入到set/multiset的数据,都会自动被排序,set/multiset的本质其实是二叉树

区别

  • set中不可以插入重复的元素
  • multiset可以插入重复的元素

构造函数

  • set/multiset的构造有两个,这里拿set的构造举例,multiset与set是一样的
set< T >;//默认构造
set(const set& s);//将s的数据拷贝到本身

使用:

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

void print(set<int>& s)
{
	for (set<int>::iterator b = s.begin();b != s.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	set<int> s;
	s.insert(10);
	print(s);
	set<int> s1(s);
	print(s1);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

赋值函数

  • 对于set/multiset而言,赋值操作只有一个,是操作符重载
set& operator=(const set &s);//将s的值拷贝到本身

使用:

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

void print(set<int>& s)
{
	for (set<int>::iterator b = s.begin();b != s.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	set<int> s;
	s.insert(10);
	print(s);
	set<int> s1;
	s1 = s;
	print(s1);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

大小操作函数

  • 在set/multiset中,对于大小是不能重新命名的,只能知道有多少个元素,或者是否为空
size()://返回容器中元素个数
empty();//判断容器是否为空

使用:

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

void test1()
{
	set<int> s;
	if (s.empty())
	{
		cout << "为空" << endl;
	}
	cout << s.size() << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

交换函数

  • set中也可以让两个容器之间进行交换,也是swap
swap(s);//和s交换数据

使用:

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

void print(set<int>& s)
{
	for (set<int>::iterator b = s.begin(); b != s.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	set<int> s;
	s.insert(1);
	set<int> s1;
	s1.insert(0);
	cout << "交换前" << endl;
	print(s);
	print(s1);
	s.swap(s1);
	cout << "交换后" << endl;
	print(s);
	print(s1);

}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

插入函数

  • 在set中,只有一种插入方式
insert(T elem);//插入一个elem

使用:

void test1()
{
	set<int> s;
	s.insert(1);
	set<int> s1;
	s1.insert(0);
	cout << "交换前" << endl;
	print(s);
	print(s1);
	s.swap(s1);
	cout << "交换后" << endl;
	print(s);
	print(s1);

}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

  • 同时验证了,插入进去的数会自己进行排序,排序为从小到大

删除函数

  • 删除函数有四个基本的
clear();//删除容器中所有元素
erase(pos);//删除迭代器pos指向的元素,返回下一个元素的迭代器
erase(beg,end);//删除迭代器beg到end之间的元素,返回下一个元素的迭代器
erase(T elme);//删除容器中所有的elem,在set中是一个,但是multiset中可能有多个

使用:

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

void print(set<int>& s)
{
	for (set<int>::iterator b = s.begin(); b != s.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	set<int> s;
	for (int i = 0; i < 10; i++)
	{
		s.insert(i);
	}
	print(s);
	set<int>::iterator b = s.begin();
	b++; b++; b++; b++; b++;
	s.erase(b);
	print(s);
	set<int>::iterator b1 = s.begin();
	b1++; b1++; b1++; b1++; b1++;
	s.erase(b1, s.end());
	print(s);
	s.erase(0);
	print(s);
	s.clear();
	print(s);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

查找函数

  • 在set中还可以查找一个元素是否存在,查找方式是通过key
find(key);//查找key是否存在,存在返回元素的迭代器,不存在返回end()

使用:

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


void test1()
{
	set<int> s;
	for (int i = 0; i < 10; i++)
	{
		s.insert(i);
	}
	set<int>::iterator f=s.find(10);
	if (f != s.end())
	{
		cout << "找到了" << endl;
	}
	else
	{
		cout << "没有找到" << endl;
	}
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

统计函数

  • 可以统计这个容器有多少个这个元素,对于set来说,只有0和1,因为set是不可以拥有重复数据的
count(key);//统计key的个数

使用:

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


void test1()
{
	set<int> s;
	for (int i = 0; i < 10; i++)
	{
		s.insert(i);
	}
	cout << s.count(10) << endl;
	cout << s.count(7) << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

为什么set不可以插入重复数据

  • 那为什么multiset可以插入重复数据,set不可以呢?它们的区别就在这里,其他都一样,这是因为什么?是因为在set插入数据的时候,会返回插入结果,表示是否插入成功,但是multiset不会,那set怎么去检测插入是否成功呢?这里可以使用pair数组,因为对于set插入失败成功所返回的值就是用pair数组去接收的

pair数组

  • pair数组是一个拥有两种数据类型的数组,都需要使用的时候去规定,在set中,已经封装好pair数组的两个元素了,第一个为迭代器,第二个是bool,这个时候,如果插入成功,bool会返回真,如果没有插入成功,会返回假,可以去使用一下,在set插入中pair的接收是这样的:
pair< set< T >:: iterator , bool >;

检测:

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

void test1()
{
	set<int> s;
	pair<set<int>::iterator, bool> in = s.insert(10);
	pair<set<int>::iterator, bool> in1 = s.insert(10);
	if (in.second/*访问第二个数据类型的元素*/)
	{
		cout << "插入成功" << endl;
	}
	else 
	{
		cout << "插入失败" << endl;
	}

	if (in1.second/*访问第二个数据类型的元素*/)
	{
		cout << "插入成功" << endl;
	}
	else
	{
		cout << "插入失败" << endl;
	}
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

pair数组创建

  • 在有两个成对的数据出现的时候,就可以利用pair接收两个数据,那怎么去创建一个pair数组呢?有两种方式
pair< T1, T2/*数据类型*/ > p(t1 ,t2/*数据*/);
pair< T1, T2/*数据类型*/ > p=make_pair(t1 ,t2/*数据*/);

使用:

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

void test1()
{
	pair<int, int > p(10, 20);
	cout << p.first << " " << p.second << endl;
	pair<int, int>p1 = make_pair(10, 20);
	cout << p1.first << " " << p1.second << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

怎么样去改变set容器的排序规则

  • 如果现在创建了一个set容器,但是不想让它按着从小到大的顺序排,想按照从大到小排,可以吗?是可以的,可以利用仿函数去改变,将有这个仿函数的类当类型传给set容器

使用:

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

class sort_big
{
public:
	bool operator()(int v1, int v2) const
	{
		return v1 > v2;
	}
};
void test1()
{
	set<int, sort_big> s;
	for (int i = 0; i < 10; i++)
	{
		s.insert(i);
	}
;	for (set<int,sort_big>::iterator b = s.begin(); b != s.end(); b++)
	{
		cout << *b << " ";
	}
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

下一座石碑

  • 这座石碑倒下了,露出了下一座石碑…

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

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

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

相关文章

智公网:一级消防师要掌握的知识点!

一、建筑物的耐火等级 1、建筑物的耐火等级分为四级&#xff0c;一、二、三、四级。 2、节点缝隙或金属承重构件节点的外露部位&#xff0c;应做防火保护层。 3、民用建筑的耐火等级、层数、长度和面积&#xff0c;一二级最大防火分区的长度250m。多层建筑最大允许建筑面积2…

【gcc/g++/gdb/cmake】命令

文章目录参考资料一、gcc/g/make1 gcc和g的区别2 gcc/g与make区别3 make与cmake区别二、开发环境搭建1 编译器&#xff0c;调试器&#xff0c;CMake安装2 GCC编译器2.1 编译过程2.1.1 -E 预处理-Pre-Processing .i文件2.1.2 -S 编译-Compiling .s文件2.1.3 -C 汇编-Assembling …

软件工程(二)——需求工程、统一建模语言UML

目录 一、需求获取 二、需求分析 1.结构化需求分析 2.面向对象分析方法OOA 三、UML 41视图 四、UML 图 (1)用例图 (2)类图、对象图 (3)顺序图 &#xff08;4&#xff09;活动图 &#xff08;5&#xff09;状态图 &#xff08;6&#xff09;通信图 软件需求指用户对系…

【科研】ET-BERT代码分析

0. 数据集 论文使用的TLS1.3数据集是从 2021 年 3 月到 2021 年 7 月在中国科技网 (CSTNET) 上收集的。 如果要使用自己的数据集的话&#xff0c;需要检查数据格式是否与datasets/cstnet-tls1.3/目录下一致&#xff0c;并且在data_process/目录下指定数据集路径。 用于微调的…

Pomotroid 使用指南:一款高颜值 PC 端番茄时钟

文章首发于个人公众号&#xff1a;「阿拉平平」 番茄工作法作为一套高效易行的时间管理方案&#xff0c;是由意大利人弗朗西斯科西里洛于 1992 年创立的。作者发明的初衷源自于自身严重的拖延症&#xff0c;于是他找来一个厨房用的番茄计时器&#xff0c;调到 10 分钟&#xff…

游戏SDK(二)框架设计

前言 根据上一篇游戏SDK&#xff08;一&#xff09; 客户端整体架构&#xff0c;介绍了游戏SDK 及 游戏SDK的需求分析。根据需求分析&#xff0c;对游戏SDK的设计分为3大块&#xff1a; 客户端&#xff1a;接口统一&#xff0c;做好逻辑转发和处理。具体渠道具体实现&#xf…

【高并发】- 生产级系统搭建 - 4

前言 关于高并发系统中&#xff0c;当前比较热门的还是属于“秒杀”系统&#xff0c;前面章节在整理了“秒杀”系统的相关设计概念后&#xff0c;本章节&#xff0c;来讲解扣减库存相关的业务逻辑。 1 库存的那些事 一般电商网站中&#xff0c;购买流程一般都是这样的&#xff…

多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch

目录&#xff1a;一、Callable接口Callable的用法小结二、ReentrantLockReentrantLock 的用法ReentrantLock 和 synchronized 的区别&#xff1f;为什么有了 synchronized 还需要 juc(java.util.concurrent) 下的 lock&#xff1f;三、信号量 Semaphore如何理解信号量&#xff…

Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

本节内容使用用例基类自定义TestSuitecollect-only的实现testlist的实现用例tags的实现rerun-fails的实现命令行参数的使用更简单的用例编写使用用例基类因为每条用例都需要从excel中读取数据&#xff0c;解析数据&#xff0c;发送请求&#xff0c;断言响应结果&#xff0c;我们…

阿里云ECS学习笔记1

ECS&#xff1a;弹性计算服务。CPU可以热插、内存可变大变小、硬盘可以增加~ 注册&#xff1a; 在企业中&#xff0c;应该以企业的身份进行注册&#xff0c;而不是以个人身份进行注册。 手机号&#xff1a;行政部门专门管理注册的账号资源的&#xff0c;而不使用个人或者老板…

【可解释性机器学习】解释基于XGBoost对泰坦尼克号数据集的预测过程和结果

解释基于XGBoost对泰坦尼克号数据集的预测过程和结果1. 训练数据2. 简单的 XGBoost 分类器3. 解释重量4. 解释预测5. 添加文本特性参考资料本文介绍如何分析XGBoost分类器的预测&#xff08; eli5也支持 XGBoost和大多数 scikit-learn树集成的回归&#xff09;。 我们将使用 Ti…

【数据结构】8.5 归并排序

文章目录相邻两个有序子序列的归并归并排序算法归并排序算法分析基本思想 将两个或两个以上的有序子序列归并为一个有序序列。在内部排序中&#xff0c;通常采用的是2-路归并排序。 即&#xff1a;将两个位置相邻的有序子序列 R[l…m] 和 R[m1…n] 归并为一个有序序列 R[l…n]…

1个寒假能学会多少网络安全技能?

现在可以看到很多标题都声称三个月内就可以转行网络安全领域&#xff0c;并且成为月入15K的网络工程师。那么&#xff0c;这个寒假的时间能学多少网络安全知识&#xff1f;是否能入门网络安全工程师呢&#xff1f; 答案是肯定的。 虽然网络完全知识是一门广泛的学科&#xff…

在线支付系列【9】微信支付之申请微信公众号

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言申请微信公众号前言 由于微信支付的产品体系全部搭载于微信的社交体系之上&#xff0c;所以直连商户或服务商接入微信支付之前&#xff0c;都需要有一个微信社交载体&#xff0c;该载体对应…

天啦撸~ChatGPT通过国际软件测试工程师(ISTQB)认证了~

天啦撸&#xff01;目前最火的AI应用ChatGPT通过ISTQB认证了~ 近期&#xff0c;国外的一位工程师&#xff0c;放出了他用ChatGPT通过认证的相关信息。 ChatGPT相信大家都知道是什么了&#xff0c;ISTQB相信很多测试小伙伴也不陌生&#xff0c;而且很多考证的小伙伴也对此梦寐以…

Linux之网络性能测试工具netperf实践

一、netperf简介 Netperf是一种网络性能的测量工具&#xff0c;主要针对基于TCP或UDP的传输。Netperf根据应用的不同&#xff0c;可以进行不同模式的网络性能测试&#xff0c;即批量数据传输&#xff08;bulk data transfer&#xff09;模式和请求/应答&#xff08;request/rep…

公司通知要大裁员,hr太强势,和所有人吵起来,老板见势不妙,不得不答应大家要求,把HR一起裁掉了!...

在裁员中&#xff0c;hr一般都会代表老板的利益和员工对抗&#xff0c;但如果hr和员工闹翻了&#xff0c;老板会维护hr吗&#xff1f;一位网友说&#xff1a;一上班就收到消息要裁员&#xff0c;立马让报上名单面谈&#xff0c;锁电脑关权限。后面那些人面谈的时候吵起来了&…

OpenAI Chatgpt注册及使用教程

零、什么是chatgpt?​ 1、简介 ChatGPT&#xff08;Chat Generative Pre-trained Transformer&#xff09;是OpenAI于 2022 年 11 月推出的聊天机器人。它建立在 OpenAI 的GPT-3大型语言模型家族之上&#xff0c;并经过微调&#xff08;一种迁移学习的方法&#xff09;…

双点双向的ISIS与OSPF、OSPF与OSPF、ISIS与ISIS环境以路由策略解决(1tag、2tag、4tag介绍与配置)

3.1.1 双点双向的ISIS与OSPF、OSPF与OSPF、ISIS与ISIS环境以路由策略解决&#xff08;1tag、2tag、4tag介绍与配置&#xff09; OSPF与ISIS双点双向 次优的产生与解决&#xff1a; 由于OSPF引入外部路由之后其优先级为150&#xff0c;再由ASBR进行双向引入之后。 原先OSPF外部…

闲鱼自动化软件——筛选/发送系统 V20已经测试完毕

做程序&#xff0c;就是不断地改&#xff0c;不断地优化。当改动达到一定程序&#xff0c;已经和前面形成断代&#xff0c;程序的升级时刻便到了。V20做了哪些更改或优化。1。优化抓取&#xff1a;在抓取环境优化参数&#xff0c;使抓取更顺滑&#xff0c;抓取数据效果上更准确…