Part.I Introduction
之前有写过 STL 的来龙去脉,但是后来没怎么用过,这篇文章就简要记录一下如何使用这些标准模板库(Standard Template Library, STL)。容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。
在C++标准中,STL被组织为13个头文件(7个数据结构+6个算法),如下:
头文件 | 说明 | 备注 |
---|---|---|
#include <vector> | 定义vector 序列模板,这是一个大小可以重新设置的数组类型,比普通的数组更安全,更灵活 | 数据结构:基本容器 |
#include <deque> | 定义deque 序列模板,支持在开始和结尾的高效插入和删除操作 | 数据结构:基本容器 |
#include <queue> | 为队列(先进先出)数据结构定义序列适配器queue 和priority_queue | 数据结构:容器适配器 |
#include <stack> | 为堆栈(后进先出)数据结构定义序列适配器stack | 数据结构:容器适配器 |
#include <list> | 定义list 序列模板,这是一个序列的链表,常常在任意位置插入和删除元素 | 数据结构:基本 |
#include <set> | set是一个关联容器类型,用于以升序方式存储唯一值。 | 数据结构:关联式容器 |
#include <map> | map 是一个关联容器类型,允许根据键值是唯一的,且按照升序存储。multimap 的键值是不唯一的,unordered_map 是无序的(或者说根据插入顺序存储) | 数据结构:关联式容器 |
#include <algorithm> | 提供一组给予算法的函数,包括置换、排序、合并和搜索 | 算法 |
#include <numeric> | 在数值序列上定义一组一般数学操作 | 算法 |
#include <functional> | 定义了许多函数对象类型和支持函数对象的功能,函数对象是支持operator() 函数调用运算符的任意对象 | 算法 |
#include <iterator> | 给迭代器提供定义和支持 | 算法 |
#include <memory> | 给容器、管理内存的函数和auto_ptr 模板类定义标准内存分配器 | 算法 |
#include <utility> | 定义重载的关系运算符,简化关系运算符的写入,它还定义了pair 类型 | 算法 |
首先关于上面的 7 种数据结构可以分为 3 大类:
- 基本容器:或者叫做序列式容器,包括
vector, deque, list
;vector
存取数据较为高效,插入和删除的效率较慢;list
插入删除较为高效,存取较慢;双端队列deque
两端操作较快,中间操作较慢。 - 容器适配器:基于基本容器实现的好像基本容器一样的东西就是适配器,比如
stack
堆栈是内部是基于基本的vector
实现的,它和vector
有些相似;像stack, queue, priority_queue
都是容器适配器。 - 关联式容器:关联容器中的元素是按关键字来保存和访问的;而序列式容器中的元素是按它们在容器中的位置来顺序保存和访问的。关联式容器是按键值对
<key,value>
存储的,map, multimap, set, multiset
都是关联式容器。
ps: 现在回想起来本科阶段所选修的一门计算机课程《数据结构与算法》,怪不得起这个名字。
另外,按照 C++ 标准库的规定,所有标准头文件都不再有扩展名。但是,为了向下兼容,所以某些 STL 版本同时存储具备扩展名(<vector.h>
)和无扩展名(<vector>
)的两份文件,建议使用无扩展名的头文件。
实际上,早些的时候,C++
将标准库功能定义在全局空间(namespace
)里,声明在*.h
的头文件中;但是为了和C
区别开,也为了正确使用命名空间,C++
标准规定头文件不使用后缀.h
。因此,当使用<iostream.h>
时,相当于在C
中调用库函数,使用的是全局命名空间,也就是早期的C++
实现;当使用<iostream>
的时候,该头文件没有定义全局命名空间,必须使用namespace std
。
上面这段话的意思是,使用这些标准库的时候除了要加头文件,还要:
using namespace std;
Part.II 详细介绍
数据结构
- 堆栈 stack:LIFO,后进先出;放在餐桌上的一摞盘子。
- 队列 queue:FIFO,先进先出;排队做核酸的人
- 双向队列 deque:两端进行操作快,中间进行操作慢。
- 可变长数组 vector:存取高效,插入删除慢
- 关联容器 map:hash 哈希,键值对应
- 集合 set:元素唯一且有序
- 列表 list:插入删除快,存取慢
- 不同容器之间的转换参见:数据类型转换
算法