1.map的原理
2.map的比较器
- 对于key来说
- key是结构体的时候注意要重载<操作符号
- 对于value
3.红黑树
4.左旋右旋操作
1.map原理
它的特点是增加和删除节点对迭代器的影响很小,除了操作节点,对其他的节点都没有什么影响 。 对于迭代器来说,不可以修改键值,只能修改其对应的实值。 map 内部数据的组织, map 内部自建一棵红黑树(一种非严格意义上的平衡二叉树),这棵树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的 。
2.map的比较器
对于map的比较器,我们可以通过重载一个<操作符.
key 和 value 可以是任意你需要的类型,但是需要注意的是对于 key 的类型,唯一 的约束就是必须支持<操作符
。
for(; iter!= mapStudent.end(); ){
if((*iter).second == "student_one"){
mapStudent.erase(iter++);
}
else{
++iter;
}
}
3.红黑树原理
通过对任何一条从根到叶子的路径上各
个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡
的 。
红黑树的性质 https://zhuanlan.zhihu.com/p/72505589
1. 每个节点要么是红色,要么是黑色。
2. 根节点永远是黑色的。
3. 所有的叶节点都是空节点(即 null),并且是黑色的。
4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点)
5. 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。
这些约束强化了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。这样就让树大致上是平衡的。
4.左旋,右旋的操作
https://mp.weixin.qq.com/s/dYP5-fM22BgM3viWg4V44A
其实不管左旋右旋,都一颗看成不平衡的根节点的左右孩子进行一次调整....
在插入一个结点后应该沿搜索路径将路径上的结点平衡因子进行修改,当平衡因子大于1时,就需要进行平衡化处理。从发生不平衡的结点起,沿刚才回溯的路径取直接下两层的结点,如果这三个结点在一条直线上,则采用单旋转进行平衡化,如果这三个结点位于一条折线上,则采用双旋转进行平衡化。
1、左-左型:做右旋。
2、右-右型:做左旋转。
3、左-右型:先做左旋,后做右旋。
4、右-左型:先做右旋,再做左旋。