散列表和红黑树
哈希函数和散列表很普遍,在此就不介绍了。下面介绍一下红黑树的概念(代码太难了 溜了溜了 等我成为大佬再钻研)
红黑树的定义:
- 每个节点非红即黑
- 根节点是黑的;
- 每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的;
- 如图所示,如果一个节点是红的,那么它的两儿子都是黑的;
- 对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑节点;
- 每条路径都包含相同的黑节点;
map
map是通过红黑树实现的,红黑树内的数据时有序的,在红黑树上查找的时间复杂度是O(logN),相对于unordered_map的查询速度有所下降,但额外空间开销减小。
插入
map有三种方式插入:
- pair
- make_pair
- 大括号形式
map<int, int>mymap;
mymap.insert(pair<int,int>(num[i],1));
mymap.insert(make_pair(num[i], 1));
mymap.insert({num[i],1});
访问映射
访问映射合,直接用 [] 就能访问。比如 dict[“Tom”] 就可以获取 “Tom” 的班级了。而这里有一个比较神奇的地方,如果没有对 “Tom” 做过映射的话,此时你访问 dict[“Tom”] ,系统将会自动为 “Tom” 生成一个映射,其 value 为对应类型的默认值。并且我们可以之后再给映射赋予新的值,比如 dict[“Tom”] = 3 ,这样为我们提供了另一种方便的插入手段。
查找关键字
find count
遍历映射
for(map<int, int>::iterator iter=mymap.begin();iter!=mymap.end();iter++)
删除关键字
erase
underde_map
undered_map使用哈希表实现。unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序,存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。
集合