** 使用一个东西,却不明白它的道理,不高明!**
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 是一个很大的数,十几万几十万以上)
- O(1)或 O(c):称为常数时间(constant time)
- ……
“前闭后开”区间
“前闭后开”区间[ )
*(c.begin())
与*(c.end())
两个指针,一个指向第一个,一个指向末端的后一个(空的)
遍历的方法
所有的容器都有下面的一种 iterator,实际上是一个指针
rage-based for statement(since C++11)
rage-based for statementfor (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。
- Set/Multiset(并没有规定是什么树,但是各家编译器内部都是用红黑树,会自动分配分支,不至于一边特别长)
- Unordered Containers (C++11,其实是一种关联式容器)
HashTable 最好的一种实现,是 Separate Chaining
以下测试程序之 辅助函数
辅助函数放字符串,以模拟放的对象。
使用容器 array
array为每一段写一个 namespace
在每一段前写头文件的引用,重复无妨
变量在用的时候再去生命
把声明提前,可以便于查找
使用容器 vector
vector vectorpush_back
用于在尾部放数据
大部分容器都有 push_back
Vector使用空间的增长是两倍增长,放第3个时会使用4个,放第5个时使用8个……
发现错误,一定要 abort()
全局函数即使没有写::
也可以找到。
使用容器 list
list容器有自己的 sort,就用自己的
使用容器 forward_list
forward_listpush_front
没有push_back
使用容器 slist
slistsingle list,单向串联,非标准的
使用容器 deque
deque deque分段连续,做成连续的假象
一段叫做 buffer,一个 buffer 是512
可以向前扩充,
max_size 是最大的
deque 没有 sort
关联容器查找,非常快,基本都是0毫秒
deque 包含了 queue 和 stack 的功能
所以 queue 和 stack 里面都是有一个 deque,有人把 queue 和 stack 叫做 deque 的 adapter
使用容器 stack
stackpush 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
setkey 必须是独一无二的
使用容器 map
map使用容器 unordered_set
unordered_set unordered_set使用容器 unordered_map
unordered_map还有其他容器,如priority queue、heap
用的人少,是借用其他容器做支撑
网友评论