目录
一、容器补充
1.序列式容器与关联式容器
我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身,其元素与元素之间并没有什么关联性。
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据查找时比序列式容器效率更高 。
2.键值对
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息 。
3.树形结构的关联式容器
根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。
二、set
1.set的介绍
1.与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
2.set中插入元素时,只需要插入value即可,不需要构造键值对。
3.set中的元素不可以重复(因此可以使用set进行去重)。
4.使用set的迭代器遍历set中的元素,可以得到有序序列
5.set中的元素默认按照小于来比较
6.set中查找某个元素,时间复杂度为:log n
7.set中的元素不允许修改
8.set中的底层使用二叉搜索树(红黑树)来实现
2.set的使用
Compare:仿函数,set中元素的比较方式。
构造函数:
插入:
insert 重载了三种插入方法,值、迭代器位置、迭代器区间,这里演示最常用的值插入。
void test_set1()
{
//排序 + 去重
//去重原理:一个值已经有了,我们就不插入了
set<int> s;
s.insert(3);
s.insert(2);
s.insert(4);
s.insert(5);
s.insert(1);
s.insert(1)