rb_tree

rb_tree源码实现

G2.9版本的rb_tree源码

rb_tree底层实现红黑树,其示意图和代码如下:

  • 4个需要注意的模板参数:Key,Value,KeyOfValue,Compare
    Key就是Key,节点的大小关系是按Key排的;Value是整个node,而不是key对应的data,比如对于map来说,Value就是个pair;KeyOfValue代表如何从Value中提取出Key,也就是一个可调用对象的类型,传入一个Value,返回对应的Key;Compare提供两个Key比较的依据
  • 留意rb_tree成员header,类型是一个指向rb_tree_node的指针,rb_tree_node表示红黑树的节点类型,里面包含一个value对象,以及指向parent,left和right的指针。
  • rb_tree可以实现遍历和iterator操作,即rb_tree通过中序遍历所有元素
  • rb_tree节点的key值不可以改变,因为随意改变会破坏红黑树的结构
  • rb_tree主要提供insert_unique()和insert_equal()操作,前者表示key在rb_tree中独一无二,否则安插失败,后者表示key在rb_tree可以重复存在
  • rb_tree初始长度为12字节,因为rb_tree的成员node_count,header分别为4字节,key_compare为一个没有元素的函数,大小应为0,但是实际上编译器视其为1字节,另外编译器默认是按照4字节对齐的,所以总共12字节

G4.9版本的rb_tree源码

  • set,map,multimap和multiset的实现主要依赖于rb_tree
  • G2.9版本与G4.9版本主要区别在于,G4.9使用了Handler/Body模式
  • rb_tree初始长度为16字节(虽然侯捷老师说的是20字节,但是我自己实际测试下来应该是16字节才对),因为rb_tree的成员_M_parent,_M_right,_M_left,分别为4字节,_M_color是一个枚举类型,占4字节,所以总共16字节

(multi)set

(multi)set源码实现

G2.9版本的(multi)set源码

  • set/multiset以rb_tree作为底层结构,且value和key合一,因为key_type和value_type的类型都是Key,identity直接将key从value中分离出来
  • set的key独一无二,因此insert()调用rb_tree的insert_unique(),multiset的key可以重复使用,因此insert()调用rb_tree的insert_equal()
  • set/multiset不能通过调用iterator来修改key的值,因为set/multiset调用了rb_tree底部的const-iterator

(multi)map

(multi)map源码实现

G2.9版本的(multi)map源码

  • map/multimap以rb_tree作为底层结构,value对应的是data_type,key对应的是key_type,留意这里的value_type是pair<const Key, T>,也就是把value和key的类型整合成一个pair<const Key, T>来作为rb_tree的数值类型,所以之后需要用select1st<pair<const Key, T>>将Key和T分离出来
  • map的key独一无二,因此insert()调用rb_tree的insert_unique(),multimap的key可以重复使用,因此insert()调用rb_tree的insert_equal()
  • set/multiset不能通过调用iterator来修改key的值,但是可以修改data的值,因为map/multimap将rb_tree底部设置为pair<const Key, T>,所以Key不可以被任意调用修改

map的operator[]

  • map/multimap会二分查找对应的Key,如果Key在map/multimap对应的[first, last)的范围内的话(否则返回last),则会返回不破坏map/multimap的排列顺序的第一个Key对应的value的引用

注意事项

map和set的迭代器类型以及相关操作的时间复杂度
双向迭代器
随机访问每个元素 O(logn)
末尾插入删除元素 O(logn)
中间或开头删插元素 O(logn)
为何map和set的插入删除效率比用其他序列容器高?
map和set中所有元素都是以节点的形式来存储,插入删除操作只涉及到指针的转换,无需像vetor和deque一样考虑内存重新申请与拷贝
为何每次insert之后,以前保存的iterator不会失效?
每次执行插入和删除操作后,内存没有改变(当然被删除的那个元素本身已经失效了),所以对应的iterator也不会失效。
即如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。

【STL】rb_tree (multi)set (multi)map相关推荐

  1. 【STL】list基础(转)

    各个容器有很多的相似性.先学好一个,其它的就好办了.先从基础开始. 先看看他们的分类吧 标准STL序列容器:vector.string.deque和list.标准STL关联容器:set.multise ...

  2. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  3. L2-3 清点代码库【STL】

    L2-3 清点代码库[STL] #include<bits/stdc++.h> using namespace std;#define int long longint n,m; stru ...

  4. 【ES6】JS的Set和Map数据结构

    [ES6]JS的Set和Map数据结构 一.Set 1.基本用法 2.4种操作方法 3.4种遍历方法 4.Set的应用 1)Set转化为数组 2)去除数组的重复元素 3)实现并集(Union).交集( ...

  5. 【STL】push 和 emplace区别

    [STL]push 和 emplace区别 相信大家都知道push的作用,对数据进行插入; 往常大家都是怎么用push的呢? 对于内置数据类型大家是不是这样: 这里以stack来举例 stack< ...

  6. C++【STL】【string类的使用】

    目录 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 3. string类对象的访问及遍历操作 [LeetCode]反转字符串 string的迭代 ...

  7. UVALive - 3055 Symmetric Order【水题】【STL】

    [题目描述] In your job at Albatross Circus Management (yes, it's run by a bunch of clowns), you have jus ...

  8. map、set、multimap和multiset的使用【STL】

    文章目录 1. 容器的类型 1.1 序列式容器 1.2 关联式容器 2. 键值对 3. 底层实现方式 4. set 4.1 set的介绍 4.2 set的使用 set的模板参数列表 set的构造器 s ...

  9. 【软件测试】接口测试工具Charles之map remote setting

    目录 1. map 1.1 map功能 1.2 map remote setting 1. map 1.1 map功能 将某个请求进行重定向,用重定向的内容响应请求的内容,主要有两个功能:map re ...

最新文章

  1. 【建模必备】遗传算法的定义与生物学基础
  2. 在 ASP.NET 2.0 中上载文件 —— 解决文件大小限制
  3. LNMP下目录访问验证
  4. android webviewclient 点击事件,Android Api WebViewClient 详细解析
  5. CDH kafka JMX 启动
  6. 大势所趋与各具特色 超融合市场玩家大盘点
  7. 愚人节谁最皮?华为宣布攻克兽语,小米6复刻版官宣,微信发万元红包...
  8. mysql读取自增值失败_MySQL添加自增列失败
  9. [转]深邃之思想,纯粹之灵魂——我所了解的柳智宇学长
  10. 批量检测支付宝是否开通
  11. 计算机信息安全技术分为两个层次,李某将玉佩以合理价格转让给善意第三人朱某时,下列说法正确的是?()。...
  12. python获取元素在数组中的位置
  13. js中的JSON对象转换,过滤特殊字符数据
  14. Artemis集群(18)
  15. Android MMKV
  16. 有效的预防电脑辐射的方法
  17. 黑客攻击的几种常用手法
  18. 月下夜想曲200.6(攻略1)
  19. CAN转Modbus网关全新升级
  20. Delphi TStringGrid 类(1)

热门文章

  1. wifi 中间人攻击_公共wifi下的中间人攻击
  2. 知云翻译不能翻译或者只能翻译半句解决方案
  3. 支付宝,微信,线上支付流程介绍
  4. Github 最受欢迎的 35 个项目一览
  5. openFeign夺命连环9问
  6. 5000字、12字 连环炮、一张图快速解决线程池
  7. 微博图片去水印,自动去处微博图片水印方法
  8. ZigBee学习之7——OSAL(操作系统抽象层)API解读
  9. Hive小额数据处理(模拟数据已给出)
  10. 人人都在用的机器学习算法-决策树