STL中map,multimap,set,multiset,unordered_map,unordered_multimap,unordered_set,unordered_multiset的实现方
来源:互联网 发布:手机号码拦截软件 编辑:程序博客网 时间:2024/06/05 15:07
转自:http://blog.csdn.net/duyiwuer2009/article/details/23780041
1. map, multimap, set, multiset
g++ 中 map, multimap, set, multiset 由红黑树实现
map: bits/stl_map.h
multimap: bits/stl_multimap.h
set: bits/stl_set.h
multiset: bits/stl_multiset.h
红黑树类——_Rb_tree: bits/stl_tree.h
若要分析红黑树的实现阅读 bits/stl_tree.h 即可
2. std::pair
位于 <utility>, 本质非常简单,就是一个含有 2 个成员的类模板:
与之相关的比较重要的函数:
2.1 make_pair()
见例子
2.2 重载关系操作符
比较规则就是前面博文介绍的字典序比较(http://blog.csdn.net/duyiwuer2009/article/details/23277803),和 deque, list 等也类似,map 的比较是基于它的(因为 map 是存储着元素为 pair<key, value> 的容器,下文详细说明)。
3. map, set 的相似和本质
先看 gcc libstdc++ 实现代码:
可以看出:
1. map 的 value_type 为 std::pair<const _Key, _Tp>, 而 set 的 value_type 为 _Key, 都是通过 _Key 进行定位。
2. 从容器中存储元素的角度而言,关联容器与序列容器是一样的,只不过 map 存储的是 std::pair<const _Key, _Tp> (从 begin(), end() 返回的迭代器类型上也可以看出),区别是有个 key 与之关联。
3. 从用途上来说,set 相当于集合,方便剔除和增加新元素,map 自不用多说。
附:常见容器分类
序列容器(sequence container):
vector
list
deque
容器适配器(container adapter):
stack(last in, first out)
queue(first in, first out)
priority_queue
关联容器(associative container):
set
multiset
map
multimap
4. 红黑树
红黑树(red–black tree)是一种自平衡二叉查找树(self-balancing binary search tree),先看二叉查找树(BST)的定义和性质:
(1) 若它的左子树非空,则左子树上所有节点的值均小于它的根节点的值;
(2) 若它的右子树非空,则右子树上所有节点的值均大于(或大于等于)它的根节点的值;
(3) 它的左、右子树也分别为二叉查找树。(显然这是一个递归定义)
(4) 中序遍历(LDR: left subtree, current node(data), right subtree)将得到递增序列,所以又叫二叉排序树。
5. unordered_map, unordered_multimap, unordered_set, unordered_multiset(C++ 11)
- STL中map,multimap,set,multiset,unordered_map,unordered_multimap,unordered_set,unordered_multiset的实现方
- STL中map,multimap,set,multiset,unordered_map,unordered_multimap,unordered_set,unordered_multiset的实现方法
- map/multimap/unordered_map/unordered_multimap; set/multiset/unordered_set/unordered_multiset
- set、unordered_set、unordered_multiset、map、unordered_map、unordered_multimap
- STL set multiset map multimap unordered_set unordered_map example
- map,multimap,unordered_map,set,multiset,unordered_set
- TR1 五种新容器 之 unordered_set unordered_multiset unordered_map unordered_multimap
- 详解map、multimap、unordered_map、unordered_multimap
- STL中map,unordered_map,multimap的区别
- 【STL】STL中红黑树的应用set、multiset、map、multimap
- STL中HashTable HashMap HashSet Set Map MultiSet MultiMap总结
- 关联容器(map、set、multimap、multiset、pair、unordered_map)
- STL map, multimap, set, multiset 函数介绍
- STL容器 set、 multiset、map、multimap
- C++ STL之 map\set\multimap\multiset
- STL中hashtable,hashset,hashmap,set,map,multiset和multimap的区别
- STL中hashtable,hashset,hashmap,set,map,multiset和multimap的区别
- C++STL中,map/multimap,set/multiset 和vector的排序
- 初级-(练习用)挑7
- (DUP!) ping现象
- python numpy array 与matrix 乘方
- Going Deeper with Convolutions学习笔记
- java学习之:Iterable与Iterator的区别
- STL中map,multimap,set,multiset,unordered_map,unordered_multimap,unordered_set,unordered_multiset的实现方
- 数据库范式
- Hadoop优化与调整
- Unity3D 使用 LibUsbDotNet
- Oracle 11g 监听服务启动不了
- 【笔试】今日头条 形式化输出
- [BZOJ3038&&BZOJ3211] 势能分析线段树
- 友元
- java核心技术学习问题