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源码剖析相关推荐

  1. SGI STL源码剖析——空间配置器

    SGI STL源码剖析--空间配置器 前言 空间配置器 SGI空间配置器 内存配置和对象构造 构造和析构 空间的配置和释放 第一级配置器 第二级配置器 空间配置 重新填充 重中之重的内存池 前言    ...

  2. 【《STL源码剖析》提炼总结】 第1节:空间配置器 allocator

    文章目录 一. 什么是空间配置器 二. STL allocator的四个操作: allocate,deallocate,construct,destroy `construct()` `destroy ...

  3. STL源码剖析(一):STL概论

    本系列是结合侯捷老师的 STL源码剖析这本书看的,有理解不到位的地方,敬请提出. 版本 首先,需了解以下三个C++编译器: GNU:Unix下的编译器 VC++:windows平台下的编译器,微软公司 ...

  4. STL(C++标准库,体系结构及其内核分析)(STL源码剖析)(更新完毕)

    文章目录 介绍 Level 0:使用C++标准库 0 STL六大部件 0.1 六大部件之间的关系 0.2 复杂度 0.3 容器是前闭后开(左闭右开)区间 1 容器的结构与分类 1.1 使用容器Arra ...

  5. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1

    最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...

  6. 《STL源码剖析》学习--6章--_rotate算法分析

     最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...

  7. 《STL源码剖析》学习--6章--power算法分析

    最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...

  8. STL源码剖析---移动advance

    目录 一. 迭代器 二. 类型萃取机 2.1 处理类实现的迭代器 2.2 处理原生指针实现的迭代器 三. advance 3.1 iterator_category 3.2 激活重载机制 3.3 实现 ...

  9. STL源码剖析——P142关于list::sort函数

    在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...

  10. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

最新文章

  1. python对list中所有数值类型转换
  2. Android设备adb授权的原理【转】
  3. oracle中睡眠,sql - ORACLE中的睡眠功能 - 堆栈内存溢出
  4. SQL Server 入门复习(2008)图解
  5. NYOJ 123 士兵杀敌(四)
  6. tomcat日志格式中的含义
  7. 人大副教授:本科生一定要做科研吗?九大灵魂拷问
  8. java 审计 漏洞函数_Java Web代码审计流程与漏洞函数
  9. 使用Aptana搭建Python开发环境
  10. 怎么设计接口测试用例更好——百度大佬“教你写用例”
  11. 虚拟机XP系统突然变卡顿解决办法
  12. 数据评估:SD(标准差), 方差, 方差分析(ANOVA)
  13. win10怎么将计算机放桌面壁纸,windows10自带壁纸在哪里_win10电脑自带的桌面壁纸保存在哪...
  14. Docker下安装部署MsSql
  15. 基于LDC1614 1612的电感式位移传感器
  16. andoird 设置锁屏上不显示通知
  17. TopCoder Arena 插件配置(1)Greed 2.0
  18. 具体应如何办理股票开户?
  19. 关于.h文件的书写格式
  20. Mac 下设置隐藏文件可见

热门文章

  1. (转载)高光谱数据读取by multibandread函数
  2. ※C++随笔※=☆C++基础☆=※№→C++中 #include与#include
  3. Codeforces Round #187 (Div. 2) D
  4. 九度OJ题目1000: A + B(数学)
  5. FPGA BCD计数器(一位)
  6. php formdata 解析,系统学习前端之FormData详解
  7. java读CSV文件入数组
  8. c 语言编写个人所得税程序,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  9. qml 发光_“木头”也能发光,研究人员:或用于家庭照明及显示
  10. svn server 配置 与TortoiseSVN、Ankhsvn+VS使用 及 问题