什么是 STL
STL ( The C++ Standard Template Library ),C++标准模板库,是一个算法、数据结构和其他组件的集合,可用于简化C++程序的开发。STL提供了一系列的 容器 (container),如 vector、list、map,以及搜索、排序和操作数据的 算法 (algorithm)。
STL的主要优点之一是它提供了一种编写通用的、可重复使用的代码的方法,可以应用于不同的数据类型。这意味着,你可以一次写好一个算法,然后将其用于不同类型的数据,而不必为每种类型单独写代码。
STL 的组成
- 容器 (Container): STL 提供了一系列的容器,如 vector、list、map、set 和 stack 等,它们可以用来存储和操作数据。
- 算法 (Algorithm): STL 提供了一系列的算法,比如 sort、find 和 binary_search,这些算法可以用来操作存储在容器中的数据。
- 迭代器(Iterator): 迭代器是提供遍历容器中元素的方法的对象。STL提供了一系列的迭代器,比如前向迭代器 (forward iterator)、双向迭代器 (bidirectional iterator) 和随机访问迭代器 (random access iterator),它们可以与不同类型的容器一起使用。
- 函数对象(Function objects): 函数对象,也被称为functors,是可以作为算法的函数参数使用的对象。它们提供了一种将函数传递给算法的方法,允许你自定义其行为。
- 分配器(Allocator):分配器是一种用于管理内存分配和释放的工具。
- 适配器(Adapter):适配器是一种用于在现有的容器或迭代器(或上面其他组件,没有算法适配器)上添加新功能的工具,其本质还是容器和迭代器。
迭代器
常用的迭代器包括:输入迭代器(Input Iterator)、输出迭代器(Output Iterator)、前向迭代器(Forward Iterator)、双向迭代器(Bidirectional Iterator)、随机访问迭代器(Random Access Iterator)5种。输入迭代器和输出迭代器,它们不是把数组或容器当做操作对象,而是把输入流/输出流作为操作对象。这里简单介绍后面3种迭代器。
- 前向迭代器
前向迭代器支持以下运算:
运算 | 说明 |
---|---|
* | 解引用,得到迭代器指向元素的值 |
++it | 前置递增,将迭代器指向下一个元素 |
it++ | 后置递增,将迭代器指向下一个元素,并返回指向当前元素的迭代器副本 |
==,!= | 比较两个迭代器是否相等 |
- 双向迭代器
双向迭代器支持以下运算:
运算 | 说明 |
---|---|
* | 解引用,得到迭代器指向元素的值 |
++it | 前置递增,将迭代器指向下一个元素 |
it++ | 后置递增,将迭代器指向下一个元素,并返回指向当前元素的迭代器副本 |
–it | 前置递减,将迭代器指向前一个元素 |
it– | 后置递减,将迭代器指向前一个元素,并返回指向当前元素的迭代器副本 |
==,!= | 比较两个迭代器是否相等 |
- 随机访问迭代器
随机访问迭代器则支持更多的运算:
运算 | 说明 |
---|---|
* | 解引用,得到迭代器指向元素的值 |
++it | 前置递增,将迭代器指向下一个元素 |
it++ | 后置递增,将迭代器指向下一个元素,并返回指向当前元素的迭代器副本 |
–it | 前置递减,将迭代器指向前一个元素 |
it– | 后置递减,将迭代器指向前一个元素,并返回指向当前元素的迭代器副本 |
==、!=、<、<=、>、>= | 关系运算,用于比较两个迭代器的大小关系 |
it + n | 加法,用于将迭代器向前移动 n 个元素 |
it1 - it2 和 it - n | 减法,用于计算两个迭代器之间的距离,或将迭代器向后移动 n 个元素 |
it [ n ] | 返回指向 it 后面第 n 个位置的元素的引用 |
- 实现一个简单的迭代器:
template <typename T>
class ArrayIterator {
public:
ArrayIterator(T* ptr) : ptr_(ptr) {
}
T&