1.初识 STL什么是STL
?
STL(Standard Template Library)
是C++
以模板形式提供的一套标准库 , 提供了很多开发过程需要的通用功能模块 。使用 STL
,可以让开发者将主要精力用于解决程序的高级业务逻辑,而无须关心底层的基础逻辑调用 。
STL
由 6
大部分组成:
容器
:存储和组织数据的类模板
,是STL
的核心 。迭代器
:独立于容器,提供访问容器中数据的通用操作组件 。算法
:提供通用基础算法功能,算法通过迭代器对容器中的数据进行查找、计算…… 。函数对象
:重载了括号运算符()
的模板类,为算法提供灵活的策略 。适配器
:通过对已有的容器、迭代器、函数对象进行适配,创造出新的编程组件 。配置器
:为容器服务,负责其内存空间的配置与管理 。
6
大部件遵循单一职责设计思想,组件与组件之间彼此独立,每一个组件在各自内部高度自治性地实现分配到的功能 。各组件在合作关系上 , 互为依赖,相互之间形成服务与被服务关系 。从而构建出一个精密、灵活、具有高度自适应的编程环境 。
如下图为组件之间的分工合作关系:
文章插图
学习
STL
包括:- 了解、熟悉各组件的使用 。
- 掌握各组件之间的服务关系 。
STL
知识体系庞大而复杂,非一言二语能讲透 。本文仅俯瞰一下STL
, 对STL
有一个大概了解 , 对每一个组件的细节讨论将留到系列文章中讲解 。下面通过一个简单的案例初步了解
容器、迭代器、算法、函数对象
之间的合作关系 。案例需求:求解一个已知数列中的所有质数(质数:只能被
1
和自身整除的数字) 。设计流程:
- 首先在源代码文件的头部包含程序中需要用到的所有头文件 。
#include <iostream>#include <vector>#include <algorithm>#include <cmath>using namespace std;
- 认识
STL
的vector
容器 , 使用它存储已知数列 。
STL
中的容器种类繁多,容器之间有共性操作、也存在个体差异性,可适配于不同的应用场景 。
在常规操作时 , 可选择vector
容器,需要包含<vector>
头文件 。
vector<int> nums= {2,9,10,13,21,5};
- 认识
迭代器
,遍历容器 。迭代器类似于指针,用于访问容器 。
//获取到指向容器第一个数据的迭代器vector<int>::iterator begin=nums.begin();//获取到指向器结束位置的迭代器 , 注意,并不是最后一个数据,而是最后一个数据的下一个存储位置vector<int>::iterator end=nums.end();//使用迭代器输出容器中数据while(begin!=end){cout<<*begin<<"\t";begin++;}cout<<endl;
- 认识函数对象,使用函数对象编写求解质数的算法 。函数对象可以为
STL
的算法组件提供特定的算法策略,算法组件充当了平台功能,利用平台耦合容器、函数对象 。类似于拼搭游戏,可以有各种可能 。
下面代码用到了sqrt
函数,需要包含<cmath>
头文件 。
//使用结构体作为函数对象template <typename T>struct Zs { // 函数对象的特点:重载 () 运算符 void operator()(T & x) const {//求解质数的算法bool isZs=true;for(T i=2; i<=sqrt(x); i++) {if (x % i==0) {isZs=false;break;}}if(isZs)cout<<x<<"是质数"<<endl; }};
- 使用
for_each
算法。STL
提供了大量算法,使用时需要包含<algorithm>
头文件 。
//重新指向容器的开始位置(因为前面的操作移动过迭代器)begin=nums.begin();//使用 for_each 算法组件for_each(begin,end,Zs<int>());
- 输出结果 。
文章插图
STL
使用了高内聚、低耦合的设计理念,各组件的专业能力非常强,合作时又能做到严丝合缝、润物细无声 。