map和set
STL分为序列式容器(vector、list、deque)和关联式容器(map、set)
序列式容器:数据与数据之间没有很强的联系。(各个数据之间没什么关联)。底层为线性序列的数据结构,里面存储的是元素本身。栈和队列是适配器。
关联式容器:数据和数据之间有很强的关联关系(在数据检索时比序列式容器效率更高。底层是红黑树,再底层是一棵搜索树。)
set
set的本质是Key模型(Key模型就是确认在不在的模型)。典型的set底层是二叉搜索树
Compare是一个仿函数,用来比较。默认给的是less,相当于operator<,我们可以传别的,来控制这里的比较规则、比较方式。
key_comp/value_comp获取key/value的比较器。 提供它两是为了保持set与map的一个兼容
set支持增删查,不支持修改,因为Key模型的底层是二叉搜索树,其一旦被修改,整个树就有可能错误了,所以是不允许修改的。
set的拷贝构造赋值都是深拷贝,而且是一棵树,消耗比较大。
map
map底层存储的结构是pair,pair是一个模板的键值对。map的底层是一棵树
这里能不能用auto推导?不能,它推不出来
因为其插入时,只看key,val相不相同无所谓,但是map不支持冗余,所以只要key有了,就不支持再插入了。
其实也不用typedef pair
我们可以用make_pair。前面的都是调用构造。而make_pair是一个函数模板,它的实现方式大致如下,它的优势就是自动推导,不需要我们显式地写模板参数了。make_pair是构造一个匿名pair然后返回
一般被定义成inline
map的遍历
map和set的迭代器都是双向迭代器,也就是可以正向和反向遍历。
第三十节00:11:00-00:25:00 将双箭头做特殊处理 只看了一遍,没笔记,代码只写了一点
map中的[]
两个题:第三十节1:38:40-2:58:00