文章目录
- 前言
- 一、set概念介绍
- 二、set的使用
-
- [1. 插入删除相关](#1. 插入删除相关)
- [2. 查找相关](#2. 查找相关)
- 三、set的值是不能修改的原理
- 四、基于哈希表的set
- 总结
前言
根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器。
首先是set相关:gogogo
一、set概念介绍
set就是key_tree的模型:
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。
set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。 - 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行
排序。 - set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对
子集进行直接迭代。 - set在底层是用二叉搜索树(红黑树)实现的
注意:
- 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放 value,但在底层实际存放的是由<value, value>构成的键值对。
- set中插入元素时,只需要插入value即可,不需要构造键值对。
- set中的元素不可以重复(因此可以使用set进行去重)。
- 使用set的迭代器遍历set中的元素,可以得到有序序列
- set中的元素默认按照小于来比较
- set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n
- set中的元素不允许修改,它的普通迭代器和const迭代器都是const迭代器
- 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)。这些容器底层是基于哈希表实现的,所以元素是无序存储的。以下是每种容器的简要介绍:
-
unordered_set:
- 用于存储唯一的元素集合,每个元素只能出现一次。
- 适合用于快速查找一个元素是否存在的场景。
-
unordered_multiset:
- 与
unordered_set
类似,但允许存储重复的元素。 - 适合用于需要存储非唯一元素的集合。
- 与
-
unordered_map:
- 存储键值对(key-value pairs),每个键(key)是唯一的。
- 可用于快速查找一个键对应的值。
-
unordered_multimap:
- 与
unordered_map
类似,但允许存储重复的键。 - 适合用于需要一个键对应多个值的场景。
- 与
由于这些容器基于哈希表,因此它们的查找、插入和删除操作通常具有常数时间复杂度(O(1))。
但是他们是无序的。
总结
到这里set的内容就结束啦,创作不易,求各位大大多多支持~~~😘😘😘