C++标准模板库STL
STL源码剖析
-
traits
-
allocator原理:比如16个自由链表是怎么回事,是如何向内存池申请内存的,容量不够时是如何扩容的?
-
各个容器的底层原理,这是重点!还要知道,在具体场景下,如何选择哪些容器,可选的多种容器里,各个容器的性能如何?像map和set底层的红黑树的原理,哈希表的原理,deque的原理等等
-
仿函数:这部分篇幅很小,看起来相对轻松
-
迭代器:要结合和容器,理解各种迭代器的底层原理
-
算法:需要知道常用的算法,还需要了解Lambda表达式,因为算法常常结合Lambda一起使用
一、STL六大部件:
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。
Container 通过 Allocator 取得数据储存空间
Algorithm 通过 Iterator 存取 Container 内容
Functor 可以协助 Algorithm 完成不同的策略变化
Adapter 可以修饰或套接 Functor、Iterator。
1. 容器(containers):
容器库是STL内部封装好的数据结构,是一种class template。
1.1.序列容器:array、vector、list、deque、forward_list
- 1.1.1.array、vector和数组
- 1.1.2.list
- 1.1.3. deque
1.2.关联容器
- 1.2.1map set tuple pair
map的元素是pair
tuple是一个固定大小的不同类型值的集合,是泛化的std::pair,tuple可以用于函数返回值多个的时候,和pair不同的是,pair只有两个元素,而tuple可以有多个元素(不限于两个)
map、multimap、unordered_map(hash_map)
set、multiset、unordered_set(hash_set)
2. 算法(algorithm):
是一种function template,常用的有sort、search、copy等,STL中算法与数据相分离(不像面向对象中将算法与数据封装在class中)。
3. 迭代器(iterator):
类似于泛化的指针,用来访问可迭代序列。
const_iterator\iterator以及头文件iterator
cbegin、cend,crbegin、crend
都是const型的迭代器,它们不能修改容器的值
const_iterator
可以用于const型的容器或非const的容器,它自身的值可以改(可以指向其他元素),但不能改写其指向的元素值
4. 适配器(adapter):
提供转换操作,有容器适配器、仿函数适配器、迭代器适配器。
5. 分配器(allocator):
负责空间配置与管理,用以支持容器。是一种class template。
6. 仿函数(functor):
行为类似函数,就是使一个类的使用看上去像一个函数。它的具体实现就是通过在类中重载了operator(),使这个类具有了类似函数的行为。
常见typedef
下表显示了顺序容器和关联容器中常用的typedef,这些typedef常用于变量、参数和函数返回值的一般性声明
类型别名 | 描述 |
---|---|
value_type | 容器中存放元素的类型 |
reference | 容器中存放元素类型的引用 |
const_reference | 容器中存放元素类型的常量引用,这种引用只能读取容器中的元素和进行const操作 |
pointer | 容器中存放元素类型的指针 |
iterator | 指向容器中存放元素类型的迭代器 |
const_iterator | 指向容器中存放元素类型的常量迭代器,只能读取容器中的元素 |
reverse_iterator | 指向容器中存放元素类型的逆向迭代器,这种迭代器在容器中逆向迭代 |
const_reverse_iterator | 指向容器中存放元素类型的逆向迭代器,只能读取容器中的元素 |
difference_type | 引用相同容器的两个迭代器相减结果的类型(list和关联容器没有定义operator - ) |
size_type | 用于计算容器中项目数和检索顺序容器的类型(不能对list检索) |