一、六大部件
- 「容器」
容器是一个holder object,用于存储其他对象(其元素)的集合。可以看成是一类数据的持有和管理者,它们作为类模板实现,这在作为元素支持的类型上提供了极大的灵活性。容器管理其元素的存储空间,并提供直接访问它们的成员函数或通过迭代器(具有与指针相似的属性的引用对象)访问。
- 容器可以分为序列容器、关联容器、无序关联容器、容器适配器、近容器。
- 「算法」(函数模板)
- 「迭代器」(对指针的一种泛化)
迭代器底层是由指针实现的,是容器和算法的桥梁。STL 里大多数容器都实现了自己的迭代器,我们可以使用迭代器来完成对容器的访问。迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。迭代器基本分为五种,输入、输出迭代器,正向迭代器,双向迭代器和随机迭代器。
- 「适配器」
适配器主要有容器适配器,迭代器适配器,函数适配器
- 「空间配置器」
空间配置器就是 STL 自己的“内存池”。完成对内存的申请,释放,维护。配置器有两个部分:一级空间配置器,二级空间配置器。
- 「仿函数」(函数对象)
仿函数又叫做函数对象,其本质是类的对象,一种可回调机制,在类中重载了()运算符,使对象在用()时呈现出函数的特性,所以叫做仿函数。叫仿函数体现了它的作用,叫函数对象体现其本质。
- 函数对象与函数指针相比有两个优点:第一是编译器可以内联执行函数对象的调用;第二是函数对象内部可以保持状态。
「STL的核心部件为容器、迭代器、算法三部分;适配器分别对容器、迭代器、算法进行了补充和适配,分配器为容器中的元素提供空间存储管理,仿函数丰富了算法的实现方式。」
容器
容器分类
- STL容器高可复用的实现了在编程中非常常用的数据结构:动态数组(vector),队列(queue),堆栈(stack),堆(priority_queue),链表(list),树(set),关联数组(map)
- stack,queue和priority_queue被实现为容器适配器。容器适配器不是完整的容器类,而是提供特定接口的类,这些接口依赖于某一类容器类(例如双端队列或列表)的对象来处理元素。基础容器的封装方式使得容器适配器的成员可以独立于所使用的基础容器类来访问其元素。
官方文档:容器类模板详细介绍
迭代器
容器中元素的访问依赖于迭代器(只有底层是连续数组空间存储的容器才能通过[下标]访问,vector、deque、array)。
STL根据实现功能的强弱将迭代器划分为五种类型:官方文档
- 每种容器所支持的迭代器决定了该容器所适用的STL算法。支持随机访问迭代器的容器可用于所有STL算法;指向数组的指针可以代替迭代器用于几乎几乎所有的STL算法。
- 容器的元素插入、删除、修改操作可能会导致容器对应的迭代器失效。
容器类型 | 容器 | 支持的迭代器类型 |
序列容器 | array | 随机访问迭代器 |
deque | 随机访问迭代器 | |
vector | 随机访问迭代器 | |
forward_list | 正向迭代器 | |
list | 双向迭代器 | |
关联容器 | set | 双向迭代器 |
multiset | 双向迭代器 | |
map | 双向迭代器 | |
multimap | 双向迭代器 | |
无序关联容器 | unordered_set | 正向迭代器 |
unordered_multiset | 正向迭代器 | |
unordered_map | 正向迭代器 | |
unordered_multimap | 正向迭代器 | |
容器适配器 | stack | 不支持迭代器 |
queue | 不支持迭代器 | |
priority_queue | 不支持迭代器 |
常用的预定义迭代器类
- 「iterator」 基本迭代器类 具有读写的能力
- 「const_iterator」 只读(不能修改迭代器所指元素)
- 「reverse_iterator」 反向遍历
- 「const_reverse_iterator」
例如std::vector::begin()返回值为iterator或const_iterator;而std::vector::rbegin()返回值为reverse_iterator或const_reverse_iterator。C++11标准之前是通过函数重载来返回普通迭代器和常量迭代器的,C++11标准则是用cbegin()、cend()、crbegin()、crend()显式区分。
#include
#include
int main (){
std::vector<int> myvector;
for (int i=1; i<=5; i++) myvector.push_back(i);
std::cout <"myvector contains:";
for (std::vector<int>::const_iterator it = myvector.cbegin() ; it != myvector.cend(); ++it)
std::cout <' ' <//myvector.begin()返回const_iterator类型的迭代器给it
std::cout <'\n';
for (std::vector<int>::reverse_iterator it = myvector.rbegin() ; it != myvector.rend(); ++it)
std::cout <' ' < std::cout <'\n';
return 0;
}
算法
STL提供了可以用于多种容器的算法,包含了常用的排序、搜索、取最值等操作。详见官方文档
- 对头文件中的算法大致分类:
End