C++ STL容器之set使用及复现

server/2025/2/13 8:03:10/

c++set

1. 关联式容器

vector、list、deque、forward_list(C++11) 等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而 map、set 是一种关联式容器,关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器里面存储的是 <key, value> 结构的键值对,在数据检索时比序列式容器效率更高。map 和 set 的键是唯一的,但是 mutimap 和 multiset 支持多个同名且有不同映射的键共存。

2. 键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量 key 和 value, key 代表键值,value 表示与 key 对应的信息。比如:学生的姓名和他的学号是一一对应的,那么就可以通过查找学生的姓名来查找到对应的学号。set 容器是 key 结构。set 不允许存在相同的 key(multiset除外),且 key 不可修改(因为会破坏内部的红黑树结构)。

3.set容器

形参含义:

T:键值对应 value 的类型。
Compare:比较器的类型,缺省情况下按照小于来比较,一般情况下(内置类型元索)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)。
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器。

4.set的成员函数

4.1 map的成员函数介绍

set的构造:

函数声明功能介绍
sets()构造一个空的set

set的迭代器:

函数声明功能介绍
begin()end()begin:首元素的位置;end:下一个元素的位置
cbegin()cend()c指const,cbegin和cend指向的内容不能修改
rbegin()rend()反向迭代器,rbegin从end开始,rend从begin开始,其++和–的方向相反
crbegin()crend()与前一个功能相同,但指向的内容不能修改

set的容量与元素访问:

函数名函数声明功能介绍
emptybool empty() const检测set中的元素是否为空,为空返回ture,不为空返回false
sizesize_type size() const返回set中有效元素的个数

set的修改:

函数名函数声明功能介绍
insertpair<iterator,bool> insert (const value_type& val)在 set 中插入键值对 x,注意 x 是一个键值对,返回值也是键值对;iterator 代表新插入元素的位置,bool 代表插入成功
erasevoid erase (iterator position)
size_type erase (const value_type& val)
void erase (iterator first, iterator last)
删除 position 位置上的元素
删除键值为 x 的元素
删除 [first,last) 区间中的元素
swapvoid swap (set& x)交换两个 set 中的元素
clearvoid clear()删除 set 里所有的元素

set的操作:

函数名函数声明功能介绍
finditerator find (const value_type& val) const搜索set里键等于k的元素,如果找到返回一个映射的迭代器,找不到返回end的迭代器,find函数默认查找中序的第一个相等的值
countsize_type count (const value_type& val) const搜索set里键等于k的元素,找到返回1,找不到返回0
lower_bounditerator lower_bound (const value_type& val) const在set里找>=k的元素,返回符合情况的最小键的迭代器
upper_bounditerator upper_bound (const value_type& val) const在set里找>k的元素,返回符合情况的最小键的迭代器
equal_rangepair<iterator,iterator> equal_range (const value_type& val) const

5. set的特点

STL 里的 map 和 set 用的是同一颗红黑树来实现的。

set:

Map7

注意:Rb_tree 里有一个 key_type 和一个 value_type,但 set 应该是 key 和 key 的映射关系,所以在成员变量里,STL 把 key_type和 value_type 都定义了为 _key

map:

Map8

而在 STL 的 map 里,value_type 则定义了一个 pair ,这样做的目的就是为了复用同一颗红黑树。

所以从set和map的底层来看,它们的实现方法分别是:

set<K.> ⟶ \longrightarrow rb_tree<K, K>

map<K, V> ⟶ \longrightarrow rb_tree<K ,pair<const K, V>>

这种写法实际上是由 stl_tree.h 文件中的 val 模板决定你是 key 的 set,还是 key/value 的map:

Map9

6. set的复现

C++ 的 STL 库通过 map 和 set 复用同一颗红黑树实现代码的复用,这里给出 map 的复现链接C++STL容器之map的使用及复现,set 只需要把 map.h 中 key,value 的格式改成 key,key 即可。


http://www.ppmy.cn/server/167278.html

相关文章

星动纪元ERA-42:端到端原生机器人大模型的里程碑式突破

近年来&#xff0c;人工智能技术飞速发展&#xff0c;尤其在机器人领域取得了显著进展。星动纪元近日发布的ERA-42端到端原生机器人大模型&#xff0c;无疑是这一领域的重大突破。这款模型结合自研的五指灵巧手星动XHAND1&#xff0c;能够完成各种复杂操作任务&#xff0c;并快…

Flink-DataStream API

一、什么样的数据可以用于流式传输 Flink的DataStream API 允许流式传输他们可以序列化的任何内容。Flink自己的序列化程序用于 基本类型&#xff1a;即字符串、长、整数、布尔值、数组复合类型&#xff1a;元组、POJO和Scala样例类 基本类型我们已经很熟悉了&#xff0c;下…

5、《Spring Boot自动配置黑魔法:原理深度剖析》

Spring Boot自动配置黑魔法&#xff1a;原理深度剖析 一、引言&#xff1a;为什么Spring Boot能“开箱即用”&#xff1f; Spring Boot的核心理念是**“约定优于配置”&#xff0c;开发者只需引入一个spring-boot-starter-web依赖&#xff0c;就能直接编写RESTful API&#xf…

github不翻墙就可以访问

目录 简介资料准备windows平台设置下载运行git设置firefox设置 ubuntu平台设置下载启动服务设置系统代理git设置firefox设置证书 注意事项 简介 由于github访问不稳定,严重影响了国内软件开发,在网上搜索并验证了一些方法.现在整理出来一个可以正常使用的方法, 在windows和Lin…

使用STM32F103C8T6和ESP8266链接阿里云

一、项目简介 基于 STM32F103C8T6 单片机和 ESP8266 Wi-Fi 模块&#xff0c;旨在实现通过 Wi-Fi 连接阿里云物联网平台&#xff0c;进行数据上传和远程控制 STM32F103C8T6&#xff1a;作为核心控制单元&#xff0c;负责系统的运算、数据处理和与外设的交互。STM32F103C8T6 具有…

解决珠玑妙算游戏问题:C 语言实现

一、引言 珠玑妙算游戏&#xff08;the game of master mind&#xff09;是一个有趣的逻辑推理游戏。在编程领域&#xff0c;我们可以通过编写代码来模拟游戏中计算猜中与伪猜中次数的过程。本文将详细介绍如何使用 C 语言实现这一功能&#xff0c;并对核心代码进行解析。 二、…

eclipse配置Spring

1、从eclipse下载Spring工具 进入 help – install new software… &#xff0c;如下图&#xff1a; 点击 add &#xff0c;按以下方式输入&#xff1a; Name : Spring Location : http://dist.springsource.com/release/TOOLS/update/e4.10/ 之后点击 add &#xff0c;等待…

AH比价格策略源代码

用python 获取在A股和香港上市的公司和在A股和香港上市的公司股票代码和名称并且选出港股和A股涨幅相差比较大的股票 import akshare as akdef get_ah_stocks():# 获取A股股票列表a_stock_list ak.stock_zh_a_spot_em()print(a_stock_list)a_stock_list a_stock_list[[&quo…