前言
前面的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代表key
,T2 second代表value
。key和value的类型需要由使用者指定
二. set的特殊使用
T:set中存放元素的类型,实际在底层存储<value,value>的键值对
Compare:set中元素默认按照小于类比较
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理
set是按照一定次序存储元素的容器
底层使用二叉搜索树(红黑树)实现,所以其中序遍历出来的结果,默认是升序的。
特性1
set由于是key的模型,所以不允许数据冗余
- 允许插入与模板参数相同的val值
- 允许在迭代器position位置插入val值
- 允许插入迭代器区间
可以看到,2和3我们都分别插入了2次,但在set中只实际存储了各1次。因为后一次的插入其实是失败的。
特性2
因为底层是二叉搜索树,有特殊的结构,所以不允许key值的修改。
同时为了不允许修改key值,set的普通迭代器其实有const迭代器的效果
count()
count()的作用是返回val值的个数
set因为二叉搜索树的底层结构,所以其数据有排序+去重
两个效果
三. multiset
multiset和set最大的不同就是,multiset允许数据冗余
而当使用find查找时,多个重复数据,find返回的其实是中序遍历的第一个
结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。