1.由红黑树显示的容器

map,set,multimap,multiset

2.红黑树定义与特性

  • 每个节点要么是黑色,要么是红色。(节点非黑即红)
  • 根节点是黑色。
  • 每个叶子节点(NULL)是黑色(为了简单期间,一般会省略该节点)。
  • 如果一个节点是红色的,则它的子节点必须是黑色的。(也就是说父子节点不能同时为红色)
  • 从一个节点到该节点的每一个叶子子孙节点的所有路径上包含相同数目的黑节点。(这一点是平衡的关键)
  • 新插入节点默认为红色,插入后需要校验红黑树是否符合规则,不符合则需要进行操作。
红黑树是二叉搜索树(左节点小于根节点、根节点小于右节点)
红黑树不是平衡二叉树,但比平衡二叉树效率更高,减少了左旋右旋的次数
平衡二叉树是在二叉搜索树的基础上,左右层数差不超过1
红黑树最短的分支,全部是黑节点,最长的分支则是黑红黑红这样排列,因此也保持了一定的平衡性
红黑树插入删除时,造成结构的改变,此时需要左旋、右旋等操作红黑树

3.map与unordered_map的区别

set和map因为底层是红黑树,因此是默认自排序的

而unordered如其名是不排序的,底层是hashtable

set/map的查找效率,因为黑红树是自排序搜索树,查找效率log2N

为何map和set的插入删除效率要比其他序列容器高?

简单来说,因为对于关联容器而言,不需要做内存拷贝和内存移动。map和set容器内的所有元素都是以节点方式来存储的,其节点结构和链表类似,指向父节点和子节点。

当元素数量很多时,插入和查找效率依然很高,10000->20000元素变化,log2N的值只会变化1,就是只多了一次查找

 

参考文献

https://www.jianshu.com/p/af9555cb33f9