1.什么是关联式容器呢?
🍎① vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器
,因为其底层为线性序列的数据结构,里面存储的是元素本身。
🍎② 那什么是关联式容器?它与序列式容器有什么区别?
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是 <key, value>结构的键值对
,在数据检索时比序列式容器 效率更高。
2.键值对的定义
🐧① 用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
🐧② 比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该单词,在词典中就可以找到与其对应的中文含义。(即:通过我们建立的对应关系快速的检索🔍数据)
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)
{}
};
3. set 详解
3.1 set 的基本介绍
- set是按照
一定次序
存储元素的容器(默认从小到大
);- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。
set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- 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中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n (即查找高度次
)
🐧7. set中的元素为什么不允许修改呢 ?(因为 set 里面存的数据,其实就是键
key,键肯定不允许修改的,必须保持唯一性)
🐧8. set中的底层使用二叉搜索树(红黑树)来实现
3.2 set 的使用细节
- 🍎①
set
的模板参数列表
- 🍎②
set
的构造
- 🍎②
set
的迭代器
- 🍎②
set
的容量
- 🍎②
set
的修改操作
4. map 详解
- 🍎①
map
的模板参数说明
- 🍎②
map
的构造
- 🍎③
map
的迭代器
- 🍎③
map
的迭代器