当前位置:首页 » 《休闲阅读》 » 正文

C++:set详解

25 人参与  2024年11月30日 18:03  分类 : 《休闲阅读》  评论

点击全文阅读


文章目录

前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1)find2)count3)lower_bound与upper_bound4)equal_range 三、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 log2​nset中的元素不允许修改,它的普通迭代器和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的内容就结束啦,创作不易,求各位大大多多支持~~~???
在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/194611.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1