C++: set容器

news2024/11/14 13:26:08

一、关联式容器

我们已经了解了STL中的部分容器,比如vector、list、deque等,这些容器被称为序列式容器,其底层为线性序列的数据结构,里面存储的是元素本身

关联式容器也是用来存储数据的,与序列式容器不同,关联式容器里面存储的是Key - Value结构的键值对,在数据检索时比序列式容器效率高

二 、键值对

键值对是用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量Key和Value,Key代表键值, Value代表与Key对应的信息。

键值对在STL中被定义成一个pair类型,如下所示:

struct pair
{
	typedef T1 first_type;
	typedef T2 second_type;

	T1 first;
	T2 second;
	pair()
		:first(T1())
		,second(T2())
	{}

	pair(const T1& a, const T2& b)
		:first(a)
		,second(b)
	{}
};

三、树状结构的关联式容器

STL中对关联式容器实现了两种不同结构的版本,以适应不同的场景:树状结构和哈希结构。这里主要介绍树状结构为底层的关联式容器。

树状结构的关联式容器主要有4种:map、set、multimap、multiset。

以上四种容器的共同点是:其底层都是使用**平衡二叉搜索树(即红黑树)**实现的,容器中的元素是一个有序的序列。

3.1 set

###3.1.1 set的使用

set文档介绍

  1. set是按照一定次序存储元素的容器。
  2. 在set中元素的Value就是Key,并且每个Value必须是唯一的。
  3. 在内部,set的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序的。
  4. set容器通过Key访问某个单个元素的效率通常会比unordered_set容器要慢,但是它允许按顺序对子集进行迭代。
  5. set的底层是由红黑树实现的。

注意:

  • 与map/multimap不同,map/multimap中存储的是真正的键值对pair<Key, Value>,set中只放Value但是在底层存放的是<value, value>的键值对。
  • set在插入元素的时候,只需要插入Value即可,不需要构造键值对。
  • set中的元素不可以重复(可以用set进行去重)。
  • 使用set的迭代器遍历set中的元素,可以得到有序序列。
  • set中的元素默认按小于比较,也就是升序排列。
  • set中查找某个元素的效率是O(logN)。
  • set中的元素不允许被修改。
  • set的底层是由二叉搜索树(红黑树)实现的。

set的迭代器走的是中序遍历,是一个双向迭代器,set:去重+排序

3.1.2 set的使用

1.set的模版参数

以上就是set的模版参数,我们来看下第一个模版参数,T:set中存放的元素类型,在底层的存储实际上是<value, value> 的键值对。

第二个模版参数Compare:set中用于比较的仿函数,set中的元素默认按照小于进行比较。

第三个模版参数:set中元素空间的管理方式,使用STL提供的空间配置器进行管理。

2.set的构造函数

函数声明功能介绍
explicit set (const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
构造空的set
template
set (InputIterator first, InputIterator last,
const key_compare& comp = key_compare(),
const allocator_type& = allocator_type());
使用[first, last)的迭代器区间中的元素进行构造set
set (const set& x);
set (const set& x, const allocator_type& alloc);
set的拷贝构造
void test_set()
{
	set<int> s1;//构造一个空set
	vector<int> v1;
	for (int i = 10; i >= 0; i--)
	{
		v1.push_back(i);
	}
	set<int> s2(v1.begin(), v1.end());//迭代器区间构造
	for (auto e : s2)
	{
		cout << e << " ";
	}
	cout << endl;
}

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

3.set的迭代器

函数声明功能介绍
iterator begin()返回set起始位置元素的迭代器
iterator end()返回set最后一个元素后一个位置的迭代器
const_iterator cbegin() const返回set起始位置的const迭代器
const_iterator cend() const返回set最后一个元素的后一个位置的const迭代器
reverse_iterator rbegin()返回set的第一个反向迭代器,也就是最后一个元素的后一个位置的迭代器,相当于end()
reverse_iterator rend()返回set的最后一个反向迭代器,也及时第一个元素位置的迭代器,相当于begin()
const_reverse_iterator crbegin() const返回set的第一个反向const迭代器,也就是最后一个元素的后一个位置的const迭代器,相当于cend()
const_reverse_iterator crend() const返回set的最后一个反向const迭代器,也及时第一个元素位置的const迭代器,相当于cbegin()
void test_set1()
{
	set<int> s1{ 1, 2, 3, 4, 5, 7, 0, 8 ,9 ,10, 12 };
	set<int>::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	auto it1 = s1.rbegin();
	while (it1 != s1.rend())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
}

迭代器补充:

函数声明函数功能
iterator lower_bound(x)返回 >= x 的值的位置的迭代器(左边界)
iterator upper_bound(y)返回 > y 的值的位置的迭代器 (右边界)
void test_set2()
{
	set<int> s1{ 1, 2, 3, 4, 5, 7, 0, 8 ,9 ,10, 12 };

	set<int>::iterator it = s1.lower_bound(2);//左边界
	set<int>::iterator it1 = s1.upper_bound(10);//右边界
	//相当于输出2 - 10之间的数字
	while (it != it1)
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

4.set的容量接口

函数声明功能介绍
bool empty() const检测set是否为空,如果为空就返回true,否则返回false
size_type size() const返回set中的有效元素个数
void test_set1()
{
	set<int> s1{ 1, 2, 3, 4, 5, 7, 0, 8 ,9 ,10, 12 };
	cout << s1.empty() << endl;
	cout << s1.size() << endl;
}

5.set的修改操作接口

函数声明功能介绍
pair<iterator, bool> insert(const value_type& x)在set中插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,就返回<该元素在set中的位置的迭代器,true>, 如果插入失败,就代表x在set中已经存在,返回<x在se中的位置的迭代器,false>
void erase(iterator pos)删除set中在pos位置的元素
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的元素的个数
void test_set3()
{
	set<int> s1;
	s1.insert(1);
	s1.insert(3);
	s1.insert(1);
	s1.insert(5);
	s1.insert(7);
	s1.insert(10);
	s1.insert(11);
	s1.insert(6);
	s1.insert(12);
	s1.insert(13);
	s1.insert(19);
	s1.insert(100);
	for (auto e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
	s1.erase(100);//按值删除
	for (auto e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
	s1.erase(s1.begin());//按位删除
	for (auto e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
	s1.erase(s1.begin(), ++s1.begin());//按迭代器区间删除
	for (auto e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
	auto it1 = s1.find(6);//查找值为位置返回值所在位置的迭代器
	cout << *it1 << endl;

	cout << s1.count(6) << endl;//返回值在set中出现的次数
	set<int> s2{ 1, 2, 3, 4, 5 };
	s1.swap(s2);//交换两个set中的元素
	for (auto e : s1) cout << e << " ";
	cout << endl;
	for (auto e : s2) cout << e << " ";
	cout << endl;
	s1.clear();
	cout << s1.empty();
	cout << endl;
	s2.clear();
	cout << s2.empty();
	cout << endl;
}

3.2 multiset

multiset文档介绍

multiset 大致与set相同,但是multi系列允许键值冗余,也就是说multiset中的数据可以重复。

multiset也可以走中序遍历进行排序,但是不能进行去重。

接口方面和set基本相同。这里就不在重复介绍了。

关于set的使用的介绍到这里就结束了。

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

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

相关文章

Windows中启用Linux命令功能WSL,并安装Linux子系统

文章目录 一、WSL简介 二、启用WSL 三、参考文章 一、WSL简介 WSL&#xff08;Windows Subsystem for Linux&#xff0c;适用于 Linux 的 Windows 子系统&#xff09;允许用户直接在 Windows 上运行Linux 环境&#xff08;包括大多数命令行工具、实用程序和应用程序&#x…

汽车软件开发中的功能安全挑战与应对策略:基于Jira平台构建端到端的可追溯性,实现精细化需求管理

2024年7月18-19日&#xff0c;龙智携汽车软件开发及管理解决方案创新亮相2024 ATC汽车软件与安全技术周。龙智技术支持部负责人&Atlassian认证专家叶燕秀、龙智功能安全高级工程师景玉鑫在活动主会场联合发表了精彩演讲&#xff0c;分享推动汽车软件开发与功能安全的创新实…

硬核产品经理

链接&#xff1a;硬核产品经理 (qq.com)

DNS劫持实验

实验背景 利用ettercap进行DNS欺骗&#xff0c;攻击者冒充域名服务器&#xff0c;也就是把查询的IP地址设为攻击者 的IP地址&#xff0c;这样用户上网就只能看到攻击者设计的网页。 实验设备 一个网络 net:cloud0 一台模拟黑客主机 kali 一台靶机 windows 主机 实验拓扑 …

消息队列-rabbitmq(生产者.消费者. 消息.可靠性)

生产者者的可靠性 为了保证我们生产者在发送消息的时候消息不丢失&#xff0c;我们需要保证发送者的可靠性 1.生产者重试 假如发送消息的时候消息丢失 &#xff0c;我们可以使用发送者 重试机制&#xff0c;尝试重新发送消息 实现该机制非常简单&#xff0c;只需要在yml文…

The Llama 3 Herd of Models.Llama 3 模型第1,2,3部分全文

现代人工智能(AI)系统是由基础模型驱动的。本文提出了一套新的基础模型,称为Llama 3。它是一组语言模型,支持多语言、编码、推理和工具使用。我们最大的模型是一个密集的Transformer,具有405B个参数和多达128K个tokens的上下文窗口。本文对Llama 3进行了广泛的实证评价。我们…

系统架构师考点--系统架构设计(中)

大家好。今天继续总结一下系统架构设计的一些考点。 一、软件架构复用 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核…

CVPR 2024 最佳论文分享┆物体用体积表示:一种不透明固体图形的随机几何表示方法

本文详细介绍了一篇获得CVPR 2024最佳论文提名的论文《Objects as volumes: A stochastic geometry view of opaque solids》。该论文的作者为Bailey Miller等人。论文提出了一种新的理论框架&#xff0c;从随机几何学的角度解释和改进当前体积表示方法&#xff0c;即将不透明固…

OZON大健康热卖产品,OZON大健康产品有哪些

在俄罗斯&#xff0c;随着全球健康意识的提升&#xff0c;特别是在新冠疫情之后&#xff0c;人们对于增强免疫力和保持健康的关注度显著增加。这种趋势在俄罗斯尤为明显&#xff0c;其中天然食品补剂、家居清洁用品以及个人护理产品等大健康领域的产品需求激增。以下是根据当前…

线上红酒品鉴会:与专业人士面对面交流

在繁忙的现代生活中&#xff0c;我们时常渴望寻找一个安静的角落&#xff0c;与志同道合的朋友共同品味生活的美好。当红酒的醇香与线上交流的便捷相结合&#xff0c;一场别开生面的线上红酒品鉴会便应运而生。今天&#xff0c;让我们一同走进这场与专业人士面对面交流的线上红…

WSL for Windows

1、安装 超详细Windows10/Windows11 子系统&#xff08;WSL2&#xff09;安装Ubuntu20.04&#xff08;带桌面环境&#xff09;_wsl安装ubuntu20.04-CSDN博客https://blog.csdn.net/weixin_44301630/article/details/122390018 注意&#xff0c;安装之后首次启动 Ubuntu 时&…

当我们谈论前端性能时,我们在谈论什么

前端岗位内推来了 本文结合Google官方工具 Lighthouse 分析最新的前端页面性能评分标准&#xff0c;帮助大家更好地理解各种性能指标&#xff0c;以改进和优化相关前端项目。 前端页面性能一直是大家持续关注的话题&#xff0c;因为用户留存率与页面加载性能密切相关。根据Goog…

全球模块化机器人市场展望与未来增长机遇预测:未来六年CAGR为14.9%

在全球自动化和智能化水平提升的背景下&#xff0c;模块化机器人正成为市场的焦点。本文详细分析了全球模块化机器人市场的现状、增长趋势及未来前景&#xff0c;旨在为投资者和业内人士提供深入的市场洞察和指导。 市场概览 据恒州诚思团队研究分析显示&#xff0c;2023年&am…

zeal 开发者离线文档工具

zeal是一款程序开发者不可或缺的离线文档查看器 下载地址 官网地址&#xff1a; windows版csdn下载(开箱即用含)&#xff1a;https://download.csdn.net/download/xzzteach/89588765 已离线 Android.docset Apache_HTTP_Server.docset Bash.docset Bootstrap_4.docset Bootst…

QT6安装

我是直接使用 qt-online-installer-windows-x64-4.8.0.exe 安装包一键安装的 需要安装包的可以在此路径下载&#xff1a; qt-online-installer-windows-x64-4.8.0.exe&#xff0c;qt6一键安装包资源-CSDN文库

C#编写软件发布公告2——服务端

简单说明 框架&#xff1a;.NET 6.0 MVC 数据库&#xff1a;sqlLite3(当然这是为考虑本地数据简单&#xff0c;可以考虑使用大型数据库) 一、界面效果展示 1、启动主页面 2、记录摘要界面 3、对应版本详细 二、实现代码逻辑 1、启动主页面 //关联日志文件写 builder.Loggi…

音频处理过程

1、音频 &#xff08;1&#xff09;打开设备 &#xff08;2&#xff09;从音频设备中读取数据 &#xff08;3&#xff09;将音频设备中读取的数据写入文件夹中 &#xff08;4&#xff09; 通过界面控制开始录制和结束录制&#xff08;使用多线程和状态码控制&#xff09; &…

Spring监听器不同的注册方式下带来的监听范围的变化

事件监听注册的几种方式 ApplicationContext下面简称AC 1.构建SpringApplication时注册&#xff08;可以监听AC启动阶段事件&#xff09; // 方式一: //写法1 SpringApplication application new SpringApplicationBuilder().listeners(new ApplicationPidFileWriter()).bu…

网课录制新技能,声画同步,三款录屏软件助力教师高效授课

在数字化教育的浪潮中&#xff0c;教师和培训讲师们越来越依赖于录制网课来提升教学效果。无论是PPT课件的深入讲解&#xff0c;Word文档的详细演示&#xff0c;还是操作手册的直观展示&#xff0c;一款出色的录屏软件都能使这一过程更加生动和高效。今天&#xff0c;我将为大家…

【C++/STL】:哈希 -- 线性探测哈希桶

目录 &#x1f4a1;前言一&#xff0c;unordered系列容器二&#xff0c;哈希2.1 哈希的概念2.2 哈希函数2.3 哈希冲突 三&#xff0c;哈希冲突解决(重点)3.1 开放定址法3.2 哈希桶(重点) 四&#xff0c;线性探测的实现4.1 线性探测的基本框架4.2 插入操作4.3 查找操作4.4 删除操…