【C++STL】set

前言

前面的C++STL的博客,我们介绍了string,vector,list,deque,priority_queue还有stack和queue。
这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。
而从本节开始,我们就要开始学习关联式容器。

在这里插入图片描述

一. 关联式容器

关联式容器也是用来存储数据的,但与序列式容器不同的是,其里面存储的是<key,value>结构的键值对,在数据检索时比序列容器效率更高
更多对< key >和<key,value>区别的理解,请见[C++]二叉树搜索树的应用


键值对
键值对是用来表示具有一一对应关系的结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过英文,在字典就中就可以找到与其对应的中文含义。
VS的SGI-STL中,对键值对的定义时这样的

template <class T1, class T2>
struct pair
{
    
    
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{
    
    }
pair(const T1& a, const T2& b): first(a), second(b)
{
    
    }
};

其中T1 first代表keyT2 second代表value。key和value的类型需要由使用者指定

二. set的特殊使用

在这里插入图片描述

T:set中存放元素的类型,实际在底层存储<value,value>的键值对
Compare:set中元素默认按照小于类比较
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

set是按照一定次序存储元素的容器
底层使用二叉搜索树(红黑树)实现,所以其中序遍历出来的结果,默认是升序的。


特性1
set由于是key的模型,所以不允许数据冗余
在这里插入图片描述

  1. 允许插入与模板参数相同的val值
  2. 允许在迭代器position位置插入val值
  3. 允许插入迭代器区间

在这里插入图片描述
可以看到,2和3我们都分别插入了2次,但在set中只实际存储了各1次。因为后一次的插入其实是失败的。


特性2
因为底层是二叉搜索树,有特殊的结构,所以不允许key值的修改。
同时为了不允许修改key值,set的普通迭代器其实有const迭代器的效果
在这里插入图片描述


count()
在这里插入图片描述
count()的作用是返回val值的个数
在这里插入图片描述

set因为二叉搜索树的底层结构,所以其数据有排序+去重两个效果

三. multiset

multiset和set最大的不同就是,multiset允许数据冗余
在这里插入图片描述

而当使用find查找时,多个重复数据,find返回的其实是中序遍历的第一个
在这里插入图片描述

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_72563041/article/details/130366288