一.序列式容器和关联式容器
1.序列式容器:
<1>之前介绍的string、vector、list、deque等这些容器统称为序列式容器
<2>序列式容器逻辑结构通常是线性结构
<3>序列式容器中的元素是按他们在容器中的存储位置来顺序保存和访问的
2.关联式容器:
<1>关联式容器有map/set系列和unordered_map/unordered_set系列
<2>关联式容器逻辑结构通常是非线性结构
<3>顺序容器中的元素是按关键字来保存和访问的
注:map和set底层是红⿊树,红⿊树是⼀颗平衡⼆叉搜索树。set是key搜索场景的结构,map是key/value搜索场景的结构。
二.set系列
注:文档链接:set - C++ Reference (cplusplus.com)
1.set类的介绍
<1>set默认要求T(关键字类型)⽀持⼩于⽐较,如果想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数
<2>set底层存储数据的内存是从空间配置器申请的
<3>set底层是⽤红⿊树实现,增删查效率是O(logN),迭代器遍历是⾛的搜索树的中序遍历
2.set的构造和迭代器
<1>set的⽀持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序
<2>set的iterator和const_iterator都不⽀持迭代器修改数据,因为修改关键字数据,会破坏底层搜索树的结构。
3.set的增删查:具体实现参考文献
4.set和multiset的区别:
<1>set不支持重复数据的插入,multiset支持数据冗余
<2>multiset在find时,有多个key,会返回中序遍历的第⼀个
三.map系列
注:文档链接:map - C++ Reference (cplusplus.com)
1.map类的介绍
<1>Key就是map底层关键字的类型,T是map底层value的类型
<2>map默认要求Key⽀持⼩于⽐较,如果需要的话可以⾃⾏实现仿函数传给第⼆个模版参数
<3>map底层存储数据的内存是从空间配置器申请的
<4>map底层是⽤红⿊树实现,增删查改效率是O(logN),迭代器遍历是⾛的中序遍历,所以是按key有序顺序遍历的
<5>map底层的红⿊树节点中的数据,使⽤pair<Key,T>存储键值对数据。
补充:pair类的介绍
(1)文档链接:pair - C++ Reference (cplusplus.com)
(2)其实pair可以视为一个存有两个元素的小数组,将具有一定联系的两个值放在pair里面,想用的时候可以直接拿出来,避免了无法同时找到与它关联值的困扰
2.map的构造
<1>map的⽀持正向和反向迭代遍历,遍历默认按key的升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序
<2>map⽀持修改value数据,不⽀持修改key数据,因为修改关键字数据,会破坏底层搜索树的结构。
3.map的增删查:具体实现参考文献
注:map的增删与set的使用大体相同,但是map的find返回的是iterator,不仅可以确认key在不在,还可以找到key映射的value,同时通过迭代还可以修改value
4.map的修改
<1>map第⼀个⽀持修改的⽅式时通过迭代器,迭代器遍历时或者find返回key所在的iterator修改
<2>通过接口operator[]修改数据,但是operator[]不仅仅⽀持修改,还⽀持插⼊数据和查找数据
注:map的operator[]的用法与之前学过的不太一样,这里不再用于通过下标定位数据了,而是利用迭代器实现数据的插入,查找与修改
5.map和multimap的区别
<1>multimap⽀持键值key冗余
<2>multimap在find时,有多个key,会返回中序遍历的第⼀个
<3>multimap不⽀持[],因为⽀持key冗余,无法根据key定位相应的value值