Q:STL中set底层实现方式? 为什么不用hash?

A: 第一个问题:set底层实现方式为RB树(即红黑树)。

第二个问题:

首先set,不像map那样是key-value对,它的key与value是相同的。关于set有两种说法,第一个是STL中的set,用的是红黑树;第二个是hash_set,底层用得是hash table。红黑树与hash table最大的不同是,红黑树是有序结构,而hash table不是。但不是说set就不能用hash,如果只是判断set中的元素是否存在,那么hash显然更合适,因为set 的访问操作时间复杂度是log(N)的,而使用hash底层实现的hash_set是近似O(1)的。然而,set应该更加被强调理解为“集合”,而集合所涉及的操作并、交、差等,即STL提供的如交集set_intersection()、并集set_union()、差集set_difference()和对称差集set_symmetric_difference(),都需要进行大量的比较工作,那么使用底层是有序结构的红黑树就十分恰当了,这也是其相对hash结构的优势所在。

参考文献:

《STL map 和 set的实现》

C++ STL中set底层实现方式相关推荐

  1. 【C++】STL中deque底层剖析

    文章目录 一.关于deque 二.底层结构 (1)deque迭代器 (2)deque结构 (3)内存结构图 一.关于deque std::deque ( double-ended queue ,双端队 ...

  2. C++ STL : 模拟实现STL中的容器适配器stack和queue

    目录 什么是容器适配器 stack stack的文档介绍-(来自cplusplus) stack的实现 queue queue的文档介绍-(来自cplusplus) queue的实现 什么是容器适配器 ...

  3. 一文搞懂 STL 中 deque 与 hashtab 的底层实现

    文章目录 一.模板特化 二.设计容器必须定义的型别 三.deque 四.心心念念的优先队列 五.hashtable的构造 一.模板特化 针对任何模板参数更进一步的条件限制所设计出来的一个特化版本,如: ...

  4. C语言中直接函数调用和间接函数调用的底层调用方式 X86 AArch64

    总结一下X86和AArch64架构下C语言中直接函数调用和间接函数调用的底层调用方式.主要是想记录一下在机器码这个层面直接函数调用和间接函数调用如何获取目标函数的地址. 1.直接函数调用 话不多说,先 ...

  5. STL中迭代器的作用,有指针为何还要迭代器

    请你来说一下STL中迭代器的作用,有指针为何还要迭代器 参考回答: 1.迭代器 Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴 ...

  6. C++ STL : 模拟实现STL中的关联式容器map和set

    目录 关联式容器 键值对 底层红黑树的改造 仿函数 红黑树的迭代器 完整代码 set set的文档介绍 set的实现 map map的文档介绍 map的实现 operator[] 完整代码 multi ...

  7. C++ STL : 模拟实现STL中的list类

    文章目录 list list的介绍 list的优缺点 list的迭代器失效问题 实现的接口 节点部分 迭代器部分 list部分 代码实现 list list的介绍 list的文档介绍 list是可以在 ...

  8. c++的STL中的map(哈希表)与unordered_map

    map: unordered_map: map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的 unordered_map:unordered_map内部实 ...

  9. 深入解析C++ STL中的常用容器

    转载:http://blog.csdn.net/u013443618/article/details/49964299 这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的 ...

最新文章

  1. #x开头的是什么编码呢。浏览器可以解释它。如中国等同与中文中国?
  2. 【转】PHP foreach 小结
  3. ThreadGroup其实比ExecutorService更好
  4. Codechef Coders’Legacy 2018 CLSUMG Sum of Primes
  5. Ubuntu 18.x 环境下mysql创建用户并更改用户权限
  6. Leetcode重点250题
  7. 通用目标检测(集合)
  8. 蓝桥杯2020年第十一届C++省赛第四题-蛇形填数
  9. css中的一些选择器的用法总结
  10. Spring AOP之概念解释
  11. linux查看u盘的分区格式化,linux U盘格式化ext3
  12. 解决局域网共享文件夹要求输入用户名密码访问的问题
  13. matplotlib画箱线图,添加非参数检验-秩和检验的结果
  14. Shake Shack上海第7家门店开业
  15. Springboot中国古代史在线学习网站 毕业设计-附源码260839
  16. 贝叶斯(朴素贝叶斯,正太贝叶斯)及OpenCV源码分析
  17. calsite原理_Calcite 处理一条SQL - II (Rels Into Planner)
  18. [收集]仿163邮箱的JS编辑器
  19. 构建表情符号制作应用程序
  20. 3DMax下载与安装(注册机为网上收集,仅供学习与研究,支持正版)

热门文章

  1. Mysql查询结果只有一条的情况下把值赋值给变量,再用if else 流程判断
  2. IDEA注册jar包使用和常用插件
  3. 【转】sip中的subscribe和notify扩展应用技术
  4. 基于javascript的asp数据库操作类,含分页、字符串截取、用户登陆验证[原创]
  5. 高并发大流量专题---10、MySQL数据库层的优化
  6. [译] 前端组件设计原则
  7. 怎么建立微信生态用户增长模型?
  8. SylixOS中select原理及使用分析
  9. 火狐中的CSS Grid Inspector新增强大的功能
  10. 《数据结构与抽象:Java语言描述(原书第4版)》一P.4.1 标识类