侯捷老师——STL源码剖析
generic programming | GP 泛型编程 |
object oriented | OO 面向对象 |
C++ Standard Library | C++标准库 |
Standard Template Library | STL 标准模板库 |
P1 认识headers、版本、重要资源
- C++标准库中有百分之八十左右都是由 STL组成的
常用网站:
- cplusplus.com
- cppreference.com
- gcc.gnu.org
建议阅读书籍:
- the C++ standard library 第二版
- STL 源码剖析
P2 STL 体系结构基础介绍
- 程序 = 数据结构 + 算法
1、STL 六大部件(components)
部件名称 | 英文名 | 作用 |
---|---|---|
容器 | containers | 容器就是用来放东西,东西就需要占用内存,解决内存的事情 |
分配器 | allocator | 分配器是用来支持容器的,解决内存的事情 |
算法 | algorithms | 具有某种功能的函数 |
迭代器 | iterators | 属于泛型指针,作为 算法和容器沟通的桥梁 |
适配器 | adapters | 使 XX 看起来像是 XX, XX 可以是另外五种部件,都可以适当的转换 |
仿函数 | functors | 其实,它的作用就相当于是一个函数 |
2、OO & GP
面向对象思想的核心:
把数据放在类中,
把处理数据的函数也放在类中,
两者形成一个 class
泛型编程思想的核心:
- 把数据放在容器中,是一个类
- 把操作数据的动作包装成算法,形成另外的类
- 两者是独立的
P3 容器分类
总的来说容器有10种,根据大类可以分为两种,哈希表也可以归类为关联容器中
sequence container | 顺序容器 |
---|---|
associated container | 关联容器 |
unordered container | 无序容器 |
separate chaining | 拉链法 |
顺序容器
- array: 连续存储、size固定
- vector: 连续存储、size可以自动向后延伸,这个自动增长的过程就是分配器来干的事情哦~
- string: 与 vector 相似,专门用来存储 字符串。
- deque: 连续存储、size可以向前或者向后延伸
- list: 不连续的链式存储、双向链表。源码中是双向环状链表
- forward_list:不连续的链式存储、单向链表
备注: 1、容器适配器 stack、 queue 都是用 deque 实现的,所以说是顺序存储的结构。
2、容器适配器 priority queue 其实是二叉堆,所以是链式存储的结构
关联容器
STL中的这四种结构是用红黑树来实现的,是高度平衡的BST,查找比较快
其实 set 的 key 就是 value,第一次有这样的概念
map 是<key, value>对儿 pair<int, int>(a, b)
关联容器都是链式存储的。
set:
multiset:可重复
map:
multimap:可重复,不能用 [ ] 做 insert,
哈希表、也可称为无序容器
STL中处理 哈希碰撞 的方式均采用了 separate chaining (拉链法)
公认目前最优的处理方案
经过哈希函数就会分配对应的篮子。哈希函数造的篮子,会比元素多,也很正常。
如果元素的个数等于篮子的个数,就会把篮子的个数增加为原来的二倍,然后将原来的元素打散,重新进行哈希映射。
- 哈希表也可以归类为关联容器中
- unordered_set:
- unordered_map:
Q1:关于有序和无序
其实还是有一个问题,前四种关联容器其实不也是会自动排序吗?
每插入一个元素,都会对整个树的所有节点进行重新的排序,排序后就是有序的
哈希表的排序是经过哈希函数映射之后的顺序,不也算有序吗?而且当元素的个数等于篮子的个数时,也会发生重排序,
感觉和 红黑树的操作很相似,只不过一个是经过哈希函数,一个就是在红黑树上进行的排序
A1:懂了hhh 开心~
离散数学中有序的概念是一类的关系,这个关系需要满足传递性
所谓传递性是指:给定 1< 2 , 2<3, 根据给定的关系可以推导出 1<3
红黑树中的有序是满足这种传递性的,所以称之为有序
而对于哈希表来说,由于哈希函数的形成的有序是不符合这样的传递性的,哈希的有序是自身的一种有序
比如哈希函数后的 对于 1< 2 , 2<3,哈希后可能就会有 1==3,所以才称哈希表是无序的
侯捷老师——STL源码剖析相关推荐
- SGI STL源码剖析——空间配置器
SGI STL源码剖析--空间配置器 前言 空间配置器 SGI空间配置器 内存配置和对象构造 构造和析构 空间的配置和释放 第一级配置器 第二级配置器 空间配置 重新填充 重中之重的内存池 前言 ...
- 【《STL源码剖析》提炼总结】 第1节:空间配置器 allocator
文章目录 一. 什么是空间配置器 二. STL allocator的四个操作: allocate,deallocate,construct,destroy `construct()` `destroy ...
- STL源码剖析(一):STL概论
本系列是结合侯捷老师的 STL源码剖析这本书看的,有理解不到位的地方,敬请提出. 版本 首先,需了解以下三个C++编译器: GNU:Unix下的编译器 VC++:windows平台下的编译器,微软公司 ...
- STL(C++标准库,体系结构及其内核分析)(STL源码剖析)(更新完毕)
文章目录 介绍 Level 0:使用C++标准库 0 STL六大部件 0.1 六大部件之间的关系 0.2 复杂度 0.3 容器是前闭后开(左闭右开)区间 1 容器的结构与分类 1.1 使用容器Arra ...
- 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1
最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...
- 《STL源码剖析》学习--6章--_rotate算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...
- 《STL源码剖析》学习--6章--power算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...
- STL源码剖析---移动advance
目录 一. 迭代器 二. 类型萃取机 2.1 处理类实现的迭代器 2.2 处理原生指针实现的迭代器 三. advance 3.1 iterator_category 3.2 激活重载机制 3.3 实现 ...
- STL源码剖析——P142关于list::sort函数
在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
最新文章
- python对list中所有数值类型转换
- Android设备adb授权的原理【转】
- oracle中睡眠,sql - ORACLE中的睡眠功能 - 堆栈内存溢出
- SQL Server 入门复习(2008)图解
- NYOJ 123 士兵杀敌(四)
- tomcat日志格式中的含义
- 人大副教授:本科生一定要做科研吗?九大灵魂拷问
- java 审计 漏洞函数_Java Web代码审计流程与漏洞函数
- 使用Aptana搭建Python开发环境
- 怎么设计接口测试用例更好——百度大佬“教你写用例”
- 虚拟机XP系统突然变卡顿解决办法
- 数据评估:SD(标准差), 方差, 方差分析(ANOVA)
- win10怎么将计算机放桌面壁纸,windows10自带壁纸在哪里_win10电脑自带的桌面壁纸保存在哪...
- Docker下安装部署MsSql
- 基于LDC1614 1612的电感式位移传感器
- andoird 设置锁屏上不显示通知
- TopCoder Arena 插件配置(1)Greed 2.0
- 具体应如何办理股票开户?
- 关于.h文件的书写格式
- Mac 下设置隐藏文件可见
热门文章
- (转载)高光谱数据读取by multibandread函数
- ※C++随笔※=☆C++基础☆=※№→C++中 #include与#include
- Codeforces Round #187 (Div. 2) D
- 九度OJ题目1000: A + B(数学)
- FPGA BCD计数器(一位)
- php formdata 解析,系统学习前端之FormData详解
- java读CSV文件入数组
- c 语言编写个人所得税程序,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
- qml 发光_“木头”也能发光,研究人员:或用于家庭照明及显示
- svn server 配置 与TortoiseSVN、Ankhsvn+VS使用 及 问题