第六周 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++标准库,版本

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)
六大部件关系

STL 六大部件关系

六大部件关系

复杂度,Complexity,Big-oh

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

  1. O(1)或 O(c):称为常数时间(constant time)
  2. ……
常见的Big-oh

“前闭后开”区间

“前闭后开”区间

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

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

rage-based for statement
for (decl : coll){
  statement
}

auto keyword(since C++11)

auto keyword

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

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

容器-结构与分类

容器-结构与分类
  • 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

以下测试程序之 辅助函数

辅助函数

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

使用容器 array

array

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

使用容器 vector

vector
vector

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

使用容器 list

list

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

使用容器 forward_list

forward_list

push_front没有push_back

使用容器 slist

slist

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

使用容器 deque

deque
deque

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

使用容器 stack

stack

push pop
先进后出,不提供 iterator

使用容器 queue

queue

先进先出
push pop,不提供 iterator

使用容器 multiset

multiset

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

使用容器 multimap

multimap

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

使用容器 unordered_multiset

unordered_multiset
unordered_multiset

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

使用容器 unordered_multimap

unordered_multimap

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

使用容器 set

set

key 必须是独一无二的

使用容器 map

map

使用容器 unordered_set

unordered_set
unordered_set

使用容器 unordered_map

unordered_map

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

分配器测试

使用分配器 allocator

allocator
allocator
allocator
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容