第一讲&第二讲(Geek Band)

标准库与泛型编程

内容提示:泛型编程(GP)与面向对象编程(OOP)的根本差异,模板的意义以及运用。
课程目标:
1.浅尝C++标准库
2.深入认识C++标准库
3.良好使用C++标准库
4.扩充C++标准库

STL vs CSL(标准模板库 vs C++标准库):CSL=STL+else(其他内容)

header files的写法标准
注1:编译器不影响标准库的使用
注2:学习网址推荐

【1】 http://www.cplusplus.com/
【2】 http://en.cppreference.com/w/
【3】 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html

STL六大部件

六大部件
容器(Containers):用来存放数据。
分配器(Allocator):负责空间配置与管理,实现动态空间的分配、管理、释放。
算法(Algorithms):模板编程,问题处理的策略、方法。
迭代器(Iterator):泛化指针,扮演容器与算法间的“粘合剂)。
仿函数(Functors):行为类似函数,可作为算法的某种策略。
适配器(Adapters):修饰容器/仿函数/迭代器接口的东西,所有操作由底层的deque提供。
STL六大部件 应用举例

复杂度介绍:

big O

container 区间介绍

container 前闭后开区间

for loop的新用法

语法规则

auto keyword

auto 分析

容器结构分析

三类容器

Sequence containers(序列式容器)按照放入次序排列

are ordered collectionsin which every element has a certain position. This position depends on the time and place of the insertion, but it is independent of the value of the element

Array:内存连续容器,无法扩容
Vector:分配器负责处理内存。增长方式为2的n次方(可能造成浪费)。
扩充方式,尾部自动扩充。
Deque:双向队列,两端都可以扩充。


Deque 内存申请方式

list:双向链表(内存不联系)
forward-List:单向链表。内存<双向链表。

Associative containers(关联式容器)

are sorted collectionsin which the position of an element depends on its value (or key, ifit’s a key/value pair) due to a certain sorting criterion.

使用范围:快速查找(用key查找)底部为红黑树(高度平衡),map包含key,value(key!=value),set(key==value)set/map无法放入相同的元素,Multimap/multiset,元素可以相同。

Unordered (associative) containers(无序容器—特殊关联容器)

are the hash function isfast. But because such a fast perfect hash function is not always possible or mightrequire that the array consumes a huge amount of memory, multiple elements might have the same position. For thisreason, the elementsin the array are linked lists so that you can store more than one element at each array position.

底层:hash table制作。bucket个数>element的个数。元素位置相同,方成链表,链表不能太长(影响查找速度),如果太长自动调整。


Unordered containers

容器举例:

Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png

分配器

分配器代码
分配器建议搭配容器使用。小额内存 new()与delete()以及malloc()搭配free()使用。如果直接用分配器申请内存,还需要记住申请的个数(使用不方便)

OOP & GP

OOP(class 继承, 虚函数):数据与方法放在同一个类里。
GP:数据与方法分离。通过迭代器,实现方法对数据的调用。


Paste_Image.png

GP的优势:容器和算法的开发各自独立,不需要考虑对方的问题,效率提高。届时二者直接通过接口实现数据调用。

举例:通过模板实现(比大小的方法)
Paste_Image.png

STL基础:1、Operator Overloading(操作符重载)2、Templates(模板)

操作符重载规则

操作符重载规则

**模板:参照上一课程

参考书籍
容器、结构与分类

容器 list

Paste_Image.png
Paste_Image.png
Paste_Image.png

Iterator (1.typedef 2.操作符重载)

Paste_Image.png
Paste_Image.png

traits

Paste_Image.png
Paste_Image.png
Paste_Image.png

容器 vector(动态增长的数组)

自动扩充,重新申请一个两倍大的数组。非原地扩充
三个指针(start 、finish、end_of_storage),sizeof(vector)=3×指针大小。默认分配器alloc
Paste_Image.png
vector 成长的实现
查看finish与end
Paste_Image.png
vector使用会大量调用构造及析构函数,如果数据量大,要考虑时间成本

vector‘s iterator

G2.9版本

【4.9 暂时放弃看,没必要】

Paste_Image.png
Paste_Image.png
Paste_Image.png

容器 array(固定大小的数组)

Paste_Image.png
连续空间,只需用指针做迭代器,不需要特殊设计。

【4.9 暂时放弃看,没必要】

Paste_Image.png

容器forward_list(参考list看)

Paste_Image.png

容器 deque(分段连续空间)G2.9

双向扩充的实现:迭代器跳到边界时,node指向下一个缓冲区。
Paste_Image.png
map控制中心是一个vector
2.9版允许指定缓冲区的大小,通过BufSiz指定

deque插入元素时,可以自动判断,距离头近还是尾部近。然后移动短的一段。节省时间

Paste_Image.png
Paste_Image.png

deque模拟连续空间的方式

Paste_Image.png
Paste_Image.png
Paste_Image.png

Paste_Image.png
Paste_Image.png
Paste_Image.png

【G4.9】

Paste_Image.png
Paste_Image.png

容器queue&stack

queue
stack

用list做底部支撑,也能实现stack与queue的功能,代码如下:

用list做底部支撑,也能实现stack与queue的功能

但是执行效率没有deque高?(猜测)

stack可以选择vector做底部支撑,vector不支持queue的c.pop()函数

Paste_Image.png

完全不能用map做底部支撑

完全不能用map做底部支撑

————————————————————————————————————————————————

关联式容器

rb_tree(相当于小型数据库)

特点,高度平衡,可以实现快速插入以及查找

RB_TREE
Paste_Image.png
Paste_Image.png
Paste_Image.png
G2.9
G4.9
G4.9
Paste_Image.png
Paste_Image.png
Paste_Image.png
map
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png

hashtable

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

推荐阅读更多精彩内容