引言
这篇文章里介绍的东西都是STL的容器,包括map
/set
/unordered_map
/unordered_set
/multimap
/multiset
.
上述容器中map
与set
的底层结构是带有迭代器的红黑树,其他容器的底层结构都是采用 链地址法实现的哈希表。
map
map
的功能是将键值对形式的数据存储起来,建立一对一的映射关系,其底层结构为红黑树,这意味着数据是有序的。
键值对(key:value
):设有两个数据,一个被称为key
,一个称为value
,而key
与value
存在一一对应的映射关系。
举个栗子:你的身份证号与你就是一组键值对,学号与学生就是一组键值对。我们可以将键值对中的键理解为值的标志或者关键字,只要知道键值对中的键,我们就能知道它的值。
map的主要常用方法
方法名 | 功能 |
---|---|
begin() | 返回指向map头部的迭代器 |
end() | 返回指向map尾部的迭代器 |
insert() | 向map中插入一个键值对 |
erase() | 删除一个键值对 |
clear() | 清除容器中的有效数据 |
empty() | 判断容器是否为空 |
size() | 返回容器中的元素数目 |
find() | 返回容器中查找目标的迭代器,不存在则返回end() |
count() | 返回目标键值对在容器中的出现次数,0/1 |
swap() | 交换两个容器中的数据 |
rbegin() | 反向迭代器,返回指向容器尾部的迭代器 |
rend() | 反向迭代器,返回指向容器头部的迭代器 |
operator[] | 运算符重载,支持读取,修改,插入键值对 |
模拟实现
map
的模拟实现其实重头戏在于底层结构的实现——具有迭代器的红黑树
map的模拟实现
set
set
也是STL的一个容器,其功能就是数学意义上的集合。最主要的体现就是可以对数据进行去重工作。
set的主要常用方法
方法名 | 功能 |
---|---|
begin() | 返回指向容器头部的迭代器 |
rbegin() | 返回指向容器尾部的迭代器 |
end() | 返回指向容器尾部的迭代器 |
rend() | 返回指向容器头部的迭代器 |
size() | 返回容器中有效元素的数目 |
empty() | 判断容器是否为空 |
clear() | 清空容器 |
find() | 返回容器中查找目标的迭代器,不存在则返回end() |
insert() | 向容器中插入一个元素 |
erase() | 删除一个元素 |
模拟实现
map与set的类似容器对比
容器 | 底层结构 | 数据是否有序 | 映射关系 |
---|---|---|---|
map | 红黑树 | 有序 | 一对一 |
set | 红黑树 | 有序 | 一对一 |
multiset | 红黑树 | 有序 | 一对多 |
multimap | 红黑树 | 有序 | 一对多 |
unordered_set | 哈希 | 无序 | 一对一 |
unordered_map | 哈希 | 无序 | 一对一 |
unordered_multiset | 哈希 | 无序 | 一对多 |
unordered_multimap | 哈希 | 无序 | 一对多 |
【note】:
一对一:一个key
对应一个value
一对多:一个key
对应若干value