前言
在学习完之间C++模板的相关知识之后,我们仿佛打开了一个新世界的大门,原来代码还可以这样用,但是问题又来了,即使是有模板了但是这个模板还要写出来,这样是不是太麻烦了,好像还没有到达懒的真正境界,那么为了满足大部分懒人的需要,惠普实验室来了一手绝活,他们将大量的函数模板、算法等等全部进行总结归纳,编写写成了一个巨大的仓库,这样程序员们在使用时只要调用相关函数接口便可以省下大把的头发,这个库就是我们长常说的STL标准模板库。
STL是什么
STL(英文全称:standard template library),叫做标准模板库,或者叫做泛型库
。是C++所自带的基础模板代码的集合,其位于各个C++ 的头文件中,即是以源代码的方式进行提供相关功能。其中包含了大量的模板类和模板函数,包括了各种常用的容器结构以及算法功能,可以说是几十年来的算法、数据结构的研究结晶。不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
STL有什么?
STL主要有六大组件十三个头文件,六个组件分别是容器
、算法
、仿函数
、迭代器
、配接器
、空间置配器
,在惠普实验室最开始的版本中,STL被分为48个头文件,但是在现代C++标准中,被重新组织称12个头文件,详细介绍如下:
六个组件
组件名称 | 功能 | 举例 |
---|---|---|
容器 | 主要是一些用于封装数据结构的模板类,其中包括例如字符串类型、数组序列容器等 | string 、vector、list 、deque… |
算法 | STL又被称为算法的结晶,其中包括了大约一百个的数据结构的常用算法,这些算法均是以模板函数的形式存在,在std命名空间中定义,大部分功能都包含在头文件< algorithm>中,少数存在于头文件< numeric>中 | find/swap/reverse… |
仿函数 | 又称为函数对象,即如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象 | greater、less… |
迭代器 | 容器和算法中的桥梁 | iterator、const_iterator、reserve_iterator… |
配接器 | 可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器 | stack、queue、priority_queue |
空间配置器 | 为容器类模板提供自定义的内存申请和释放功能 | allocator |
十三个头文件
头文件名称 | 主要功能 |
---|---|
<iterator > | 迭代器是指指向一组元素(如数组或容器)中的某个元素,能够使用一组操作符(至少使用自增(++)和解引用(*)操作符)遍历该范围内的元素的任何对象。 |
<functional> | 定义了C++标准中多个用于表示函数对象(function object)的类模板,包括算法操作、比较操作、逻辑操作;以及用于绑定函数对象的实参值的绑定器(binder)。 |
<vector> | < vector>头文件包含vector的类模版以及该模版的显示特化版本vector< bool > |
<deque> | 定义deque容器类的头文件: |
<list> | 定义列表容器类的头文件 |
<queue> | 定义了queue和priority_queue容器适配器类的头文件: |
<stack> | 定义堆栈容器类的头文件: |
<set> | 定义set和multiset容器类的头文件: |
<map> | 定义map和multimap容器类的头文件: |
<algorithm> | 头文件定义了一组函数,特别设计用于元素范围的函数。范围是任何可以通过迭代器或指针访问的对象序列,例如一些STL容器的数组或实例。但是请注意,算法是通过迭代器直接操作值的,不会以任何方式影响任何可能的容器的结构(也不会影响容器的大小和存储分配)。 |
<numeric> | 此头文件描述了一组对数值序列执行某些操作的算法。由于它们的灵活性,它们也可以适用于其他类型的序列。 |
<memory> | 这个头文件定义了管理动态内存的通用工具: |
<utility> | 此头文件包含不相关域中的实用程序 |
六大组件示意图(该图源自网络)
STL有什么用?
网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。同时其中大量常用的算法、结构已经在底层实现,需要使用时只需要简单调用接口,节省了大量的编程时间,提高了代码可读性,具有高可重用性、高性能、高移植性、跨平台等特点。