当前位置: 首页 > news >正文

C++:set详解

文章目录

  • 前言
  • 一、set概念介绍
  • 二、set的使用
    • 1. 插入删除相关
    • 2. 查找相关
      • 1)find
      • 2)count
      • 3)lower_bound与upper_bound
      • 4)equal_range
  • 三、set的值是不能修改的原理
  • 四、基于哈希表的set
  • 总结


前言

根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器。

首先是set相关:gogogo

在这里插入图片描述


一、set概念介绍

在这里插入图片描述

set就是key_tree的模型:

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

注意:

  1. 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放 value,但在底层实际存放的是由<value, value>构成的键值对。
  2. set中插入元素时,只需要插入value即可,不需要构造键值对。
  3. set中的元素不可以重复(因此可以使用set进行去重)。
  4. 使用set的迭代器遍历set中的元素,可以得到有序序列
  5. set中的元素默认按照小于来比较
  6. set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n
  7. set中的元素不允许修改,它的普通迭代器和const迭代器都是const迭代器
  8. set中的底层使用二叉搜索树(红黑树)

二、set的使用

1. 插入删除相关

在这里插入图片描述

首先,set的插入默认是排序 + 去重
在这里插入图片描述

set的删除:有就删,没有就不做为:
在这里插入图片描述


2. 查找相关

在这里插入图片描述

1)find

首先是find: 如果找到了就会返回对应结点的迭代器,没找到就会返回end()
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


2)count

然后是count:count的作用是返回当前值出现的次数:
对于set来说count并没有太大的作用,可以说和find的作用是一样的。

在这里插入图片描述

但是对于multiset来说就有意义了,因为set是默认去重的,因此插入相同的元素只有一个,但是multiset默认是不去重的,因此count可以统计个数。

在这里插入图片描述

3)lower_bound与upper_bound

lower_bound与upper_bound用来查找一段区间:[low, up)

是一段左闭右开的区间,因为只有这样,我们用迭代器访问的时候
itlow != itup才能不漏最后一个元素。

因此:对于lower_bound找的是>=x的迭代器,
在这里插入图片描述

对于upper_bound找的是>x的迭代器。
在这里插入图片描述

如果没找到就是end()。

对于等于的情况:
在这里插入图片描述

对于的所找的值 在set中找不到:
在这里插入图片描述

4)equal_range

equal_range作用是找到相同的值的一段迭代区间,同样是左闭右开的区间。
它的返回值是一个pair,pair是两个值做组成的一对,其中first是左区间,second是右区间。
在这里插入图片描述
因此我们接收返回值需要用pair<set::const_iterator, const set::const_iterator>,pair中每一个都是set类型的const_iterator,也可以用auto接收。

这里对于set来说,因为set会去重,所以其实equal_range对于set来说没什么意义。
在这里插入图片描述

但是对于multiset来说,就有意义了,nultiset不去重,equal_range就可以返回相同的值的区间,那么我们就可以对这个区间执行删除或者其他操作了。
在这里插入图片描述


三、set的值是不能修改的原理

set只是key的模型,set是不能修改的,它的原理是set的迭代器和const迭代器都是const迭代器。
在这里插入图片描述

在这里插入图片描述


四、基于哈希表的set

除了上述两个版本,还有两个基于哈希表的版本的set.
在这里插入图片描述

这张图展示了 C++ 中的四种无序关联容器(Unordered Associative Containers)。这些容器底层是基于哈希表实现的,所以元素是无序存储的。以下是每种容器的简要介绍:

  1. unordered_set

    • 用于存储唯一的元素集合,每个元素只能出现一次。
    • 适合用于快速查找一个元素是否存在的场景。
  2. unordered_multiset

    • unordered_set 类似,但允许存储重复的元素。
    • 适合用于需要存储非唯一元素的集合。
  3. unordered_map

    • 存储键值对(key-value pairs),每个键(key)是唯一的。
    • 可用于快速查找一个键对应的值。
  4. unordered_multimap

    • unordered_map 类似,但允许存储重复的键。
    • 适合用于需要一个键对应多个值的场景。

由于这些容器基于哈希表,因此它们的查找、插入和删除操作通常具有常数时间复杂度(O(1))。
但是他们是无序的。


总结

到这里set的内容就结束啦,创作不易,求各位大大多多支持~~~😘😘😘
在这里插入图片描述

http://www.lryc.cn/news/482850.html

相关文章:

  • (一)- DRM架构
  • Docker了解
  • 【DL】YOLO11 OBB目标检测 | 模型训练 | 推理
  • vue读取本地excel文件并渲染到列表页面
  • github 以及 huggingface下载模型和数据
  • 使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏
  • 51c视觉~合集6
  • STM32(hal库)在串口中,USART和uart有什么区别?
  • 机器学习、深度学习面试知识点汇总
  • FPGA高速设计之Aurora64B/66B的应用与不足的修正
  • 如何通过PHP脚本自动推送WordPress文章至百度站长平台
  • ORA-01092 ORA-14695 ORA-38301
  • upload-labs通关练习---更新到15关
  • WPF 应用程序中使用 Prism 框架时,有多种方式可以注册服务和依赖项
  • 【ESP32】ESP-IDF开发 | 低功耗管理+RTC唤醒和按键唤醒例程
  • Windows 局域网IP扫描工具:IPScaner 轻量免安装
  • HTML的浮动与定位
  • 【网络安全 | 漏洞挖掘】我如何通过路径遍历实现账户接管
  • DB-GPT系列(四):DB-GPT六大基础应用场景part1
  • SpringCloud篇(服务拆分 / 远程调用 - 入门案例)
  • Rust 建造者模式
  • ANN DNN CNN SNN
  • go语言进阶之并发模式
  • Spring Cloud LoadBalancer:负载均衡的服务调用
  • 微信小程序之轮播图
  • 羲和数据集收集器1.3
  • UE--IOS打包失败 AutomationTool exiting with ExitCode=9 (9)
  • 第8章利用CSS制作导航菜单
  • UNIX网络编程-TCP套接字编程
  • 美团代付微信小程序 read.php 任意文件读取漏洞复现