C++主要有两大场景,面向对象编程 OOP 和 泛型编程 GP,二者的主要区别是 OOP 会把数据和方法包装在一起,通过多层的继承关系来实现复杂的功能,而 GP 则会把数据和方法分开来,很少会有继承的关系。

STL 是 c++ 的标准模板库,主要有 容器、分配器、算法、适配器、迭代器和函数对象等组成,设计之初就以 GP 为主,各类之间互相独立,比如容器和算法互相独立,通过迭代器来沟通;又比如各种容器之间并无直接的继承关系(早期)。

STL 六大组件及其关系

容器是 STL 中最被人熟知的一部分,那么容器又是如何分类的呢?

总的来说,容器可以分为序列容器和关联式容器。

一目了然

序列容器有 array(c++11)、vector、deque、List 和 Forward_List 。

array:定长数组,数组的包装类。

vector:动态数组,满了之后二倍大小扩容

deque:双向队列。其实现是一个分段式的连续存储,由一个 vector 作为基准, 数组中的元素都是指针, 指向每一个节点,数据存储在每个节点上,每个节点可以认为是一个数组。stack 和 queue 都是受限的 deque ,接口底部都是由 deque 实现,因此有人认为 stack 和 queue 不是容器,而是一种容器适配器 container adapter 。

List:双向循环链表。

Forward_List:单链表。

关联式容器有 set / multiSet、 map / multiMap、 unordered set / multiSet、 unordered-map/multiMap 等。

set / multiSet:红黑树实现,区别在于 set 中的元素是唯一的,multiSet 可以重复插入相同元素,同时不允许迭代器修改 set 中的元素,这一点是通过 const_iterator 实现的。底层是调用了 rbTree 的 unique_insert() 和 equal_insert()方法,这里可以看出,set 也是一种容器适配器。

map / multiMap:也是由红黑树实现,和 set 的区别在于节点有 key/ data 组成,而 set 中的没有 data, 或者说 data 就是 key。类似的是,无法通过迭代器修改元素的 key ,但是可以修改 data。这点是通过在定义节点类型的时候,Pair<const keyType, dataType>,可见节点是一个 pair 类型,key 是常量无法修改。

map 的[key]操作符会查找对应 key 的data,如果没有就会插入 key , 对应的 data 是默认值。因此也可以使用 [] 来插入数据,类似于先查找后 insert

unordered set/map :基于哈希表实现,所以元素是无序的。桶子的个数默认是质数,比如53 97,采用链地址来解冲突。如果元素的个数大于桶的个数,就再散列。桶增长的速度类似于vector 的增长方式,2 倍增长,选择距离这个数最近的质数作为新的桶数。 stl 有一个写死的质数列表,增长的方式按照表的内容来增长。

/*prime list*/

这个图更加直观,来自侯捷PPT。字节大小是32位机器下的size。

上图中有缩进的代表衍生关系,并非继承,而是复合:类的内部有其他类的指针而已,比如 set 内部就有一个 rb_tree 的指针,这样做可以解耦。

stl map 查找不到返回什么_STL 容器结构和分类相关推荐

  1. C++ STL map 中insert函数返回值问题

    当map中的insert函数插入失败后,返回值应该是 **pair<iterator, bool>**型,第二个参数bool值在插入成功时返回true,失败时返回false 那么第一个返回 ...

  2. C++ STL学习笔记(2) 容器结构与分类

    接着学习侯捷老师的C++ STL! 在使用容器的时候,需要明白容器中元素之间在内存里的关系是什么样的,是连续的,还是非连续的. 容器可以分为两类: 1. sequence container , 即序 ...

  3. C++ 笔记(24)— STL map 类(map实例化、插入、查找、删除)

    1. STL 映射类简介 map 和 multimap 是键-值对容器,支持根据键进行查找,区别在于,后者能够存储重复的键,而前者只能存储唯一的键. 为了实现快速查找, STL map 和 multi ...

  4. C++ STL map的使用和性能分析

    1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操 作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 ...

  5. (Fw)STL map 详解

    1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操 作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 ...

  6. C++ map容器和multimap容器(STL map容器)

    目录 1. 关联容器和map容器概述 2. map容器 2.1 map的创建以及初始化列表 2.2 map容器的一般常用属性(方法) 2.3 插入数据 2.4 数据的访问和遍历 2.5 数据的删除 2 ...

  7. 【C++】STL map 与 multimap 用法和区别

    参考: https://blog.csdn.net/shuzfan/article/details/53115922 https://www.nhooo.com/cpp/cpp-map-swap-fu ...

  8. STL map 简介

    STL map 简介 转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607859.html 1.目录 map简介 map的功能 使用ma ...

  9. JAVA SE学习day_13 :Map 查找表

    一.java.util.Map 查找表 Map体现的样子是一个多行两列的表格,其中左列称为key,右列称为value,Map总是根据key获取对应的value.因此我们可以将查询的条件作为key,对应 ...

  10. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

最新文章

  1. 解决Windows7修改hosts时提示:您没有权限在此位置中保存文件
  2. SAP UI5 未来发展的趋势之一:拥抱 TypeScript
  3. HTML中小meta的大作用
  4. sqlserver oracle插件,SQLServer链接服务器至Oracle
  5. JRebel Idea热更新插件
  6. java如何画矩形条和填充_java.awt.Graphics 类的哪个方法可绘制填充矩形?
  7. 剑指offer全书题解 (Python)【更新完毕】
  8. 如何使用数据质量服务和SQL Server集成服务清除数据
  9. 埃尔米特(Hermite)插值及其MATLAB程序
  10. 【知识图谱系列】清华大学基于对比学习的图谱预训练模型GCC
  11. SIP - pjsip Linux Windows 编译安装
  12. c语言中正确的常量表达式,C语言常量变量表达式
  13. 3DES加密算法原理
  14. VirusTotal智能搜索安卓样本示例
  15. thymeleaf模板获取markdown数据后,渲染到页面上(showdown.js)
  16. Apache Druid 总结
  17. 为什么我不建议编程初学者使用Vim,一张图告诉你
  18. 领导看了会炸毛的溢出理论
  19. 微信小程序发布详细步骤
  20. 看雪2w3w安卓高级研修Frida原理学习

热门文章

  1. Google提供的超强圆角效果
  2. 《MySQL必知必会》学习笔记——第八章(用通配符过滤)
  3. logback 打印日志参考,包含异步打印日志及历史日志压缩
  4. 什么是反射,为什么要用反射,反射的知识讲解
  5. Java面试题,成员变量以及成员方法的调用,类和对象的关系,程序详细流程,类和对象栈堆的详细解答
  6. html页面插歌,怎样在HTML播放器里插入歌曲
  7. java密码验证代码_java用户名密码验证示例代码分享
  8. WPF 设置TextBox为空时,背景为文字提示。
  9. Oracle与MySQL的几点区别
  10. Android开发之SDCardUtils工具类。java工具详细代码,附源代码。判断SD卡是否挂载等功能...