【C++】STL标准模板库容器——set

news2024/9/26 19:45:12

🦄个人主页:修修修也

🎏所属专栏:C++

⚙️操作环境:Visual Studio 2022


目录

📌关联式容器set(集合)简介

📌set(集合)的使用

🎏set(集合)的模板参数列表

🎏set(集合)的构造函数

🎏set(集合)的迭代器

🎏set(集合)的容量

🎏set(集合)的修改操作

结语


        在之前对STL的学习中,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,根据"数据在容器中的排列"特性,这些容器统称为序列式(sequence)容器,因为其底层为线性序列的数据结构,里面存储的是元素本身

        还有一种容器是关联式(associative)容器, 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高

        下图列出了STL中的各种容器,以及其基层与衍生层的关系:


📌关联式容器set(集合)简介

        我们先来看一下cplusplus.com - The C++ Resources Network网站对set的文档介绍:

        总结一下:

  1. set是按照一定次序存储元素的容器。
  2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
  5. set在底层是用二叉搜索树(红黑树)实现的。

        注意:

  • 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
  • set中插入元素时,只需要插入value即可,不需要构造键值对。
  • set中的元素不可以重复(因此可以使用set进行去重)。
  • 使用set的迭代器遍历set中的元素,可以得到有序序列。
  • set中的元素默认按照小于来比较。
  • set中查找某个元素,时间复杂度为:$log_2 n$
  • set中的元素不允许修改(为什么?)。
  • set中的底层使用二叉搜索树(红黑树)来实现。

📌set(集合)的使用

🎏set(集合)的模板参数列表

        set的模板参数及含义如下:


🎏set(集合)的构造函数

        set的构造函数及其功能如下:

        使用示例如下:

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

int main()
{
	//构造一个没有元素的空容器
	set<int> s1;
	for (auto e : s1)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int> v;
	v.push_back(2);
	v.push_back(5);
	v.push_back(1);
	v.push_back(4);
	v.push_back(3);

	//迭代器区间构造
	set<int> s2(v.begin(), v.end());
	for (auto e : s2)
	{
		cout << e << " ";
	}
	cout << endl;

	//拷贝构造
	set<int> s3(s2);
	for (auto e : s3)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

        运行效果如下:


🎏set(集合)的迭代器

        set的迭代器相关函数及其功能如下:

        使用示例如下:

int main()
{
	vector<int> v;
	v.push_back(2);
	v.push_back(5);
	v.push_back(1);
	v.push_back(4);
	v.push_back(3);

	//迭代器区间构造
	set<int> s(v.begin(), v.end());

	//正向迭代器
	set<int>::iterator it_b = s.begin();	//访问正向迭代器开始
	cout << *it_b << endl;

	set<int>::iterator it_e = s.end();		//访问正向迭代器结束
	--it_e;									
	cout << *it_e << endl;
	++it_e;

	while (it_b != it_e)
	{
		cout << *it_b << " ";			//使用正向迭代器遍历set
		++it_b;
	}
	cout << endl;

	//反向迭代器
	set<int>::reverse_iterator rit_b = s.rbegin();		//访问反向迭代器开始
	cout << *rit_b << endl;

	set<int>::reverse_iterator rit_e = s.rend();		//访问反向迭代器结束
	--rit_e;
	cout << *rit_e << endl;
	++rit_e;

	while (rit_b != rit_e)
	{
		cout << *rit_b << " ";			//使用反向迭代器遍历set
		++rit_b;
	}
	cout << endl;

	return 0;
}

        运行结果如下:


🎏set(集合)的容量

        set的容量相关函数及其功能如下:

        使用示例如下:

int main()
{
	//构造一个没有元素的空容器
	set<int> s1;
	cout << s1.empty() << endl;
	cout << s1.size() << endl;
	cout << s1.max_size() << endl;


	vector<int> v;
	v.push_back(2);
	v.push_back(5);
	v.push_back(1);
	v.push_back(4);
	v.push_back(3);

	//迭代器区间构造
	set<int> s2(v.begin(), v.end());
	cout << s2.empty() << endl;
	cout << s2.size() << endl;
	cout << s2.max_size() << endl;
	
	return 0;
}

        运行结果如下:


🎏set(集合)的修改操作

        set的修改相关函数及其功能如下:

函数声明功能介绍
pair<iterator, bool> insert(const value_type&x)在set中插入元素x,实际插入的是<x, x>构成的
键值对,如果插入成功,返回<该元素在set中的
位置,true>,如果插入失败,说明x在set中已经
存在,返回<x在set中的位置,false>
void erase ( iterator position )

删除set中position位置上的元素

size_type erase ( const key_type& x )删除set中值为x的元素,返回删除的元素的个数
void erase ( iterator first, iterator last )删除set中[first, last)区间中的元素
void swap ( set<Key,Compare,Allocator>& st )交换set中的元素
void clear ( )将set中的元素清空
iterator find ( const key_type& x ) const返回set中值为x的元素的位置
size_type count ( const key_type& x ) const返回set中值为x的元素的个数

        insert,erase,clear,find函数使用示例如下:

int main()
{
	//构造一个没有元素的空容器
	set<int> s1;
	//插入元素
	s1.insert(3);
	s1.insert(1);
	s1.insert(7);
	s1.insert(4);
	s1.insert(0);
	s1.insert(8);
	s1.insert(2);
	s1.insert(6);
	s1.insert(9);
	s1.insert(5);

	for (auto k : s1)
	{
		cout << k << " ";
	}
	cout << endl;

	set<int>::iterator pos = s1.find(1);
	//迭代器删除元素
	s1.erase(pos);
	for (auto k : s1)
	{
		cout << k << " ";
	}
	cout << endl;

	//key值删除元素
	s1.erase(3);
	for (auto k : s1)
	{
		cout << k << " ";
	}
	cout << endl;

	//迭代区间删除元素
	s1.erase(s1.begin(), s1.find(5));
	for (auto k : s1)
	{
		cout << k << " ";
	}
	cout << endl;

	//清空set中的元素
	s1.clear();
	for (auto k : s1)
	{
		cout << k << " ";
	}
	cout << endl;

	return 0;
}

        运行结果如下:

        swap函数使用示例如下:

int main()
{
	//构造两个没有元素的空容器
	set<int> s1;
	set<int> s2;
	//s1中插入元素
	s1.insert(3);
	s1.insert(1);
	s1.insert(4);
	s1.insert(0);
	s1.insert(2);

	cout << "s1 : ";
	for (auto k : s1)
	{
		cout << k << " ";
	}
	cout << endl;

	cout << "s2 : ";
	for (auto k : s2)
	{
		cout << k << " ";
	}
	cout << endl;

	//交换s1和s2的值
	s1.swap(s2);
	cout << "s1 : ";
	for (auto k : s1)
	{
		cout << k << " ";
	}
	cout << endl;

	cout << "s2 : ";
	for (auto k : s2)
	{
		cout << k << " ";
	}
	cout << endl;

	return 0;
}

        运行结果如下:

        count()函数的定义如下图: 

      

        count函数使用示例如下:

int main()
{
	//构造一个没有元素的空容器
	set<int> s1;
	//s1中插入元素
	s1.insert(3);
	s1.insert(1);
	s1.insert(4);
	s1.insert(0);
	s1.insert(2);

	cout << "s1 : ";
	for (auto k : s1)
	{
		cout << k << " ";
	}
	cout << endl;

	cout << s1.count(2) << endl;
	cout << s1.count(4) << endl;
	cout << s1.count(6) << endl;
	cout << s1.count(8) << endl;

	return 0;
}

        运行结果如下:


结语

希望这篇关于 STL标准模板库容器——set 的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【C++】模拟实现二叉搜索(排序)树

【数据结构】C语言实现链式二叉树(附完整运行代码)

【数据结构】什么是二叉搜索(排序)树?

【C++】模拟实现priority_queue(优先级队列)

【C++】模拟实现queue

【C++】模拟实现stack

【C++】模拟实现list

【C++】模拟实现vector

【C++】标准库类型vector

【C++】模拟实现string类

【C++】标准库类型string

【C++】构建第一个C++类:Date类

【C++】类的六大默认成员函数及其特性(万字详解)

【C++】什么是类与对象?


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

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

相关文章

JavaScript异步编程:async、await的使用

async 和 await 是在 ECMAScript 2017 (ES7) 中引入的特性&#xff0c;用于处理异步操作。它们允许你以一种更加简洁和同步的方式来编写异步代码。 async 函数表示它会返回一个 Promise&#xff0c;而 await 关键字用于等待一个 Promise 解决。 关于 promise 的详细介绍&#…

蜂窝物联网全网通sim卡切网技术方案软硬件实现教程(设备根据基站信号质量自动切网)

01 物联网系统中为什么要使用三合一卡 三合一卡为用户解决了单一运营商网络无法全覆盖的缺陷&#xff0c;避免再次采购的经济成本以及时间成本和因没有信号设备停止工作造成的损失&#xff0c;保证仅需一次采购并提高设备工作效率和入网活跃度。例如下面地区的设备&#xff0…

Spring Web MVC课后作业

目录 1.加法计算器 2.⽤户登录 3.留⾔板 1.加法计算器 &#xff08;1&#xff09;需求分析 加法计算器功能, 对两个整数进⾏相加, 需要客⼾端提供参与计算的两个数, 服务端返回这两个整数计算 的结果。 &#xff08;2&#xff09;接⼝定义 请求路径&#xff1a; calc/sum 请…

Java框架学习(mybatis)(01)

简介&#xff1a;以本片记录在尚硅谷学习ssm-mybatis时遇到的小知识 详情移步&#xff1a;想参考的朋友建议全部打开相互配合学习&#xff01; 官方文档&#xff1a; MyBatis中文网https://mybatis.net.cn/index.html 学习视频&#xff1a; 067-mybatis-介绍和对比_哔哩哔…

Linux本地服务器搭建开源监控服务Uptime Kuma与远程监控实战教程

文章目录 前言**主要功能**一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址…

docker - maven 插件自动构建镜像(构建镜像:ebuy-docker:v2.0)

文章目录 1、docker服务端开启远程访问2、在pom.xml文件plugins下添加Maven的docker插件3、编写dockerfile文件4、执行maven的打包命令5、查看 镜像 ebuy-docker:v2.06、创建 容器 ebuy-dockerv2.0 上面手动构建镜像的过程比较繁琐&#xff0c;使用Maven的docker插件可以实现镜…

MySQL数据库进阶知识(五)《锁》

学习目标&#xff1a; 一周掌握数据库锁相关知识 学习内容&#xff1a; 一. 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共…

Word2vec的应用

目录 1.分词 2.模型训练 3.可视化 4.知识点个人理解 pip install gensim -i https://pypi.tuna.tsinghua.edu.cn/simple #若在jupyter notebook中安装&#xff1a; ! pip install gensim -i https://pypi.tuna.tsinghua.edu.cn/simple #导包 import jieba import re import…

一种能够一机两用的源代码保密方案

在数字化时代&#xff0c;企业面临的数据泄露风险日益增加&#xff0c;保护机密数据的安全成为了一项重要任务。SDC沙盒技术作为一种先进的数据保密解决方案&#xff0c;通过创新的沙盒概念&#xff0c;在防泄密领域展现了其独特的价值和作用。 一、SDC沙盒技术简介 SDC沙盒技…

使用ucharts写的小程序页面柱状图上方没有数字

使用uCharts官网 - 秋云uCharts跨平台图表库写的柱状图如何让柱子上放没有数据 更改前 更改后 使用uCharts官网 - 秋云uCharts跨平台图表库 写的小程序图表&#xff0c;无论是柱状图还是折线图添加一个 dataLabel: false, // 不显示数据 九可以实现不显示数据 const opts …

必看!道路运输企业主要负责人和安全生产管理人员考核新动向

必看&#xff01;道路运输企业主要负责人和安全生产管理人员考核新动向 道路运输企业两类人员#叙后尘 道路运输企业主要负责人和安全生产管理人员报考 交通运输主管部门具体组织实施本行政区域内道路运输企业主要负责人和安全生产管理人员安全考核有关工作&#xff0c;并在…

无网络entos7报错ImportError: /lib64/libm.so.6: version `GLIBC_2.27‘ not found更新glibc

最近在尝试使用sklearn的升级版cuml&#xff0c;因为是一台没有连接互联网的gpu机器&#xff0c;所以构建cuml环境过程很坎坷&#xff0c;需要各种将各种whl包在线下载后上传到服务器中。 当我终于解决完包的互相依赖问题后&#xff0c;在import cuml时候遇到一个错误&#xff…

【线程】线程池

线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现&#xff0c;线程池中的线程可以从阻塞队列中获取任务进行任务处理&#xff0c;当线程都处于繁忙状态时可以将任务加入阻塞队列中&#xff0c;等到其它的线程空闲后进行处理。 线程池作用&#xff1a; 1.降…

三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...)

三&#xff0c;MyBatis-Plus 的各种查询的“超详细说明”&#xff0c;比如(等值查询&#xff0c;范围查询&#xff0c;模糊查询…) 文章目录 三&#xff0c;MyBatis-Plus 的各种查询的“超详细说明”&#xff0c;比如(等值查询&#xff0c;范围查询&#xff0c;模糊查询...)1. …

2024中国新能源汽车零部件交易会,开源网安展示了什么?

近日&#xff0c;2024中国新能源汽车零部件交易会在十堰国际会展中心举行。开源网安车联网安全实验室携车联网安全相关产品及解决方案亮相本次交易会&#xff0c;保障智能网联汽车“车、路、云、网、图、边”安全&#xff0c;推动智能网联汽车技术突破与产业化发展。 中国新能源…

MySQL InnoDB MVCC数据结构分析

1、概述 MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制&#xff0c;通过维护不同的版本号&#xff0c;提供一种很好的并发控制技术&#xff0c;这种技术能够使读写操作不冲突&#xff0c;提升并发性能。 MySQL InnoDB存储引擎&#xff0c;在更…

【雅特力AT32】IIC使用指南_附读写EEPROM案例

目录 1.12C接口简介 2.12C接口通信 2.1主机通信流程 2.1.1 主机通信初始化 1>主机时钟初始化 2>主机通信初始化 3>主机 10 bits 寻址的特殊时序初始化 2.1.2 主机通信初始化软件接口 2.1.3 主机发送流程 2.1.4 主机发送流程软件接口 2.1.5 主机接收流程 2.1.6 主机接收…

传输大咖47 | 软件企业文件传输难题?这款FTP替代工具了解一下

随着信息技术的飞速发展&#xff0c;软件企业对数据传输的需求日益增长。虽然传统的FTP&#xff08;文件传输协议&#xff09;曾经是企业数据交换的主要力量&#xff0c;但其在许多方面的局限性已经逐渐成为企业发展的瓶颈。接下来&#xff0c;我们将带您讨论FTP的缺点&#xf…

又一个行业被背刺了,AI做服装设计这么简单,谁还需要设计师?

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;越来越多的行业开始借助AI的力量实现创新&#xff0c;而服装设计这一传统行业也无法幸免。 在过去&#xff0c;服装设计是创意与手工结合的高门槛行业&#xff0c;需要设计师花费大量时间和精力去构思、打样…

bootstrap4显示与隐藏元素方法

bootstrap4显示与隐藏元素方法 bootstrap4隐藏元素、显示元素其实非常的简单&#xff0c;因为bootstrap4已经为我们提供了相应的类&#xff0c;只需要按照它的规则去命名就可以了。 使用我们的响应式显示实用程序类更改display属性的值。我们特意只支持 的所有可能值的一个子…