【C++学习篇】map和set (set篇)

目录

1.map和set的使用

1.1序列式容器和关联式容器

[2. set系列的使⽤](#2. set系列的使⽤)

[2.1 set分类](#2.1 set分类)

2.2set类的介绍

[2.3 set的构造和迭代器](#2.3 set的构造和迭代器)

2.4set的增删查

[2.5 insert和迭代器遍历使⽤样例:](#2.5 insert和迭代器遍历使⽤样例:)

[2.6 find和erase使⽤样例:](#2.6 find和erase使⽤样例:)

2.7multiset和set的差异


1.map和set的使用

1.1序列式容器和关联式容器

前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等 ,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,⽐如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。

关联式容器也是⽤来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是⾮线性结构,两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了 。顺序容器中的元素是按关键字来保存和访问的。关联式容器有map/set系列和unordered_map/unordered_set系列。

本期讲解的map和set底层是红⿊树,红⿊树是⼀颗平衡⼆叉搜索树。set是key搜索场景的结构,map是key/value搜索场景的结构。

2. set系列的使⽤

2.1 set分类

set分为set和multiset

两者的差别set不支持key冗余插入,而multiset支持

set分类说明https://legacy.cplusplus.com/reference/set/

2.2set类的介绍

  1. set的声明如下,在官方文档中T就是set底层key的类型。(我个人认为,官方这种写法不太好,容易使初学者混淆)
  1. set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数。

  2. set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。⼀般情况下,我们都不需要传后两个模版参数。

  3. set底层是⽤红⿊树实现,增删查效率是 O(logN ) ,迭代器遍历是⾛的搜索树的中序(左子树 根 右子树),所以是有序的。

2.3 set的构造和迭代器

set的构造我们关注以下⼏个接⼝即可。

set的⽀持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序;⽀持迭代器就意味着⽀持范围for ,set的iterator和const_iterator都不⽀持迭代器修改数据,修改关键字数据,破坏了底层搜索树的结构。

构造**(从权威网站截取的)**

迭代器

2.4set的增删查

插入insert

删除erase

查找

lower_bound 和 upper_bound

2.5 insert和迭代器遍历使⽤样例:

2.6 find和erase使⽤样例:

2.7multiset和set的差异

multiset和set的使⽤基本完全类似,主要区别点在于multiset⽀持值冗余,那insert/find/count/erase都围绕着⽀持值冗余有所差异,具体参看下⾯的样例代码理解。

本期学习就结束了,谢谢大家支持!!!

相关推荐
大可不必了6 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus6 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道7 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛7 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
Rabitebla8 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
Gary移动存储固件8 小时前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
一个天蝎座 白勺 程序猿9 小时前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
eggwyw9 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
楚山之石10 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri
坤坤子吖12 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习