STL(Standard Template Library)
- STL是“Standard Template Library”的缩写,即“标准模板库”
- STL是C++内置的,不需要进行额外安装
- STL 从根本上讲是“容器”的集合,也是组件的集合。容器包括 list、vector、set、map 等;组件包括迭代器等。STL 的目的是标准化组件,与 Visual C++ 中的 ATL 相似。
- STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供。
STL能干什么
- 能让我们写代码更加方便
vector <int> a; //定义 a 数组,当前数组长度为 0,但和普通数组不同的是,此数组 a 可以根据存储数据的数量自动变长。
//向数组 a 中添加 10 个元素
for (int i = 0; i < 10 ; i++)
a.push_back(i)
//还可以手动调整数组 a 的大小
a.resize(100);
a[90] = 100;
//还可以直接删除数组 a 中所有的元素,此时 a 的长度变为 0
a.clear();
//重新调整 a 的大小为 20,并存储 20 个 -1 元素。
a.resize(20, -1)
STL组件
STL 组件主要包括容器,迭代器、算法和仿函数
容器
一些封装数据结构的模板类,例如 vector 向量容器、list 列表容器等。
容器即用来存储数据。例如 杯子是一个容器,可以放水,也可以放入果汁。
迭代器
在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂。
简单来讲,迭代器和 C++ 的指针非常类似,它可以是需要的任意类型,通过迭代器可以指向容器中的某个元素,如果需要,还可以对该元素进行读/写操作。(当参数类型是 C++ 内部类型时,迭代器即 C++ 指针。)
算法
STL 提供了非常多(大约 100 个)的数据结构算法,它们都被设计成一个个的模板函数,这些算法在 std 命名空间中定义,其中大部分算法都包含在头文件 < algorithm > 中,少部分位于头文件 < numeric > 中。
STL 提供了非常多的数据结构算法。这些算法在命名空间 std 的范围内定义,通过包含头文件 < algorithm > 来获得使用权。
STL 中的所有算法都是基于模板实现的。
仿函数(函数对象)
如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)。
行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
适配器
可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。
内存分配器
为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。
STL头文件
在惠普实验室最初发行的版本中,STL 被组织成 48 个头文件;但在 C++ 标准中,它们被重新组织为 13 个头文件
<iterator> | <functional> | <vector> | <deque> |
---|---|---|---|
<list> | <queue> | <stack> | <set> |
<map> | <algorithm> | <numeric> | <memory> |
<utility> |