文章目录
一、关联式容器
在之前的学习中,我们都接触了不少容器,如vector、list、deque等容器,这些容器统称为 序列式容器
。而stack和queue是靠deque适配出来的,之前我们也模拟实现了,所以stack和queue是 容器适配器
。今天我们还要学习一种容器:关联式容器,其中set、multiset、map和multimap都叫做 关联式容器
,下面重点学习 set和multiset。
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是 <key, value>结构的键值对,在数据检索时比序列式容器效率更高。
所以容器分为三种类型:序列式容器、关联式容器、容器适配器。
二、set
1、set的介绍
这是set的模板参数列表:
T:set中存放元素的类型,实际上在底层是<value, value>的键值对。
Compare:默认是使用小于来比较的。(可以使用仿函数修改)
Alloc:set中元素空间管理的方式,使用allocator空间配置器管理。
它的底层是**平衡二叉搜索树(红黑树)**实现的,后续我们会模拟实现。
2、set的使用
2.1、元素的插入(insert接口)
insert插入元素一共有三种方式:
①直接插入一个元素
②在迭代器的位置插入一个元素
③使用范围插入函数
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> myset;
myset.insert(3);
myset.insert(5);
myset.insert(3);
myset.insert(1);
myset.insert(1);
myset.insert(7);
set<int>::iterator it = myset.begin();
while (it != myset.end())
{
// *it = 1; set中是不允许修改的
cout << *it << " ";
it++;
}
return 0;
}
结果:
可以看到这里我们插入的元素是[3, 5, 3, 1, 1, 7],但是打印出来的值是[1, 3, 5, 7]。
很明显,set是**去重+排序**的,保证了set中的元素是唯一的,这就是set的特性。
而且set同样是支持迭代器,你可以使用迭代器或者范围for来访问容器中的元素。
对于set中的元素为什么不能修改?
- set的元素是唯一的,如果你进行修改,保不齐你修改的元素正好set中就有的。
- 修改了元素,不能保证set还是有序的,那么就必须重新调整树,这样效率是非常低的。
2.2、pair的简单讲解
官方文档说的很清楚,insert是有个返回值的:pair<iterator, bool>,这个是什么呢?这其实就是键值对,常常说的<K, V>就是键值对关系。
pair的源码中显示,它就是一个类。我们可以调用first和second来访问这个键值对。
template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{