第六周 C++标准库 体系结构与内核分析 Boolan 侯捷

** 使用一个东西,却不明白它的道理,不高明!**

1. 认识headers、版本、重要资源

所谓 Generic Programming,就是使用 template(模板)为主要工具来编写程序。

应具备的基础

  • C++ 基本语法
    (包括如何正确使用模板,templates)

我们的目标

  • level 0:使用 C++标准库
  • level 1:认识 C++标准库(胸中自有丘壑)
    知道在内存中是什么样的
  • level 2:良好使用 C++标准库
  • level 3:扩充 C++标准库

C++ Standard Library vs. Standard Template Library

  • C++ Standard Library
    C++ 标准库
  • Standard Template Library
    STL,标准模板库
    STL 有六大部件

标准库包括标准模板库。
标准库以 header files 形式呈现

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第1张图片
标准库命名

C++标准库,版本

C++标准库版本取决于使用的编译器

重要网页

CPlusPlus.com(打开慢)
CppReference.com(√)
gcc.gnu.org(打开慢)
用来查看标准库的参考文献,非常有用。

Bibliography(参考书目)

The C++ Standard Library Second Edition
STL 源码剖析(精巧)

你将获得的代码

Test-STL.cpp
内有对 STL 的各种测试

2. STL 体系结构基础介绍

我们第一个 C++ STL Application

STL 六大部件(Components):

  • 容器(Containers)
  • 分配器(Allocators)
  • 算法(Algorithms)
  • 迭代器(Iterators)
  • 适配器(Adapters)
  • 仿函式(Functors)
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第2张图片
六大部件关系

STL 六大部件关系

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第3张图片
六大部件关系

复杂度,Complexity,Big-oh

目前常见的Big-oh有下列几种情形:
(n 是一个很大的数,十几万几十万以上)

  1. O(1)或 O(c):称为常数时间(constant time)
  2. ……
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第4张图片
常见的Big-oh

“前闭后开”区间

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第5张图片
“前闭后开”区间

[ )
*(c.begin())*(c.end())
两个指针,一个指向第一个,一个指向末端的后一个(空的)
遍历的方法
所有的容器都有下面的一种 iterator,实际上是一个指针

rage-based for statement(since C++11)

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第6张图片
rage-based for statement
for (decl : coll){
  statement
}

auto keyword(since C++11)

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第7张图片
auto keyword

适度使用
首先要知道类型,auto 只是缩写
通过赋值右侧来推断左侧类型

3. 容器之分类与各种测试

容器-结构与分类

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第8张图片
容器-结构与分类
  • Sequence Containers (循序式容器)
    • Array(C++11,数组包装而成,不能扩充)
    • Vector(起点不能动,后面可以扩充)
    • Deque(两端可进可出,首尾均可扩充)
    • List(双向环状链表)
    • Forward-List (C++11,单向链表)
  • Associative Containers
    • Set/Multiset(并没有规定是什么树,但是各家编译器内部都是用红黑树,会自动分配分支,不至于一边特别长)
      Set 就是 Value,前后区别就是key能不能重复。
    • Map/Multimap
      比如学号不能重复,所以用 Map。如果放的东西是可能重复的,就不能用 Map,要用 Multimap。
  • Unordered Containers (C++11,其实是一种关联式容器)

HashTable 最好的一种实现,是 Separate Chaining

以下测试程序之 辅助函数

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第9张图片
辅助函数

放字符串,以模拟放的对象。

使用容器 array

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第10张图片
array

为每一段写一个 namespace
在每一段前写头文件的引用,重复无妨
变量在用的时候再去生命
把声明提前,可以便于查找

使用容器 vector

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第11张图片
vector
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第12张图片
vector

push_back用于在尾部放数据
大部分容器都有 push_back
Vector使用空间的增长是两倍增长,放第3个时会使用4个,放第5个时使用8个……
发现错误,一定要 abort()
全局函数即使没有写::也可以找到。

使用容器 list

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第13张图片
list

容器有自己的 sort,就用自己的

使用容器 forward_list

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第14张图片
forward_list

push_front没有push_back

使用容器 slist

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第15张图片
slist

single list,单向串联,非标准的

使用容器 deque

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第16张图片
deque
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第17张图片
deque

分段连续,做成连续的假象
一段叫做 buffer,一个 buffer 是512
可以向前扩充,
max_size 是最大的
deque 没有 sort
关联容器查找,非常快,基本都是0毫秒
deque 包含了 queue 和 stack 的功能
所以 queue 和 stack 里面都是有一个 deque,有人把 queue 和 stack 叫做 deque 的 adapter

使用容器 stack

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第18张图片
stack

push pop
先进后出,不提供 iterator

使用容器 queue

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第19张图片
queue

先进先出
push pop,不提供 iterator

使用容器 multiset

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第20张图片
multiset

自己带有 find。
放进去的重复的也可以放入,如果是 set,放进去的就会少

使用容器 multimap

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第21张图片
multimap

一个是 key,一个是 value
用 key 来找 value
用 pair 组合在一起

使用容器 unordered_multiset

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第22张图片
unordered_multiset
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第23张图片
unordered_multiset

使用 hash-table
separate chain
篮子比元素多,因为有的篮子是空的
每个篮子里元素不能太多,因为是循序查找
如果元素的个数大于等于篮子个数,篮子就需要扩充,变成大约两倍。所以篮子一定比元素多。

使用容器 unordered_multimap

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第24张图片
unordered_multimap

关联式容器,红黑树或 hash 表

使用容器 set

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第25张图片
set

key 必须是独一无二的

使用容器 map

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第26张图片
map

使用容器 unordered_set

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第27张图片
unordered_set
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第28张图片
unordered_set

使用容器 unordered_map

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第29张图片
unordered_map

还有其他容器,如priority queue、heap
用的人少,是借用其他容器做支撑

分配器测试

使用分配器 allocator

第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第30张图片
allocator
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第31张图片
allocator
第六周 C++标准库 体系结构与内核分析 Boolan 侯捷_第32张图片
allocator

你可能感兴趣的:(第六周 C++标准库 体系结构与内核分析 Boolan 侯捷)