C++ STL 概述_严丝合缝的合作者们

1.初识 STL什么是STL
STL(Standard Template Library)C++以模板形式提供的一套标准库 , 提供了很多开发过程需要的通用功能模块 。使用 STL,可以让开发者将主要精力用于解决程序的高级业务逻辑,而无须关心底层的基础逻辑调用 。
STL6 大部分组成:

  • 容器:存储和组织数据的类模板,是STL的核心 。
  • 迭代器:独立于容器,提供访问容器中数据的通用操作组件 。
  • 算法:提供通用基础算法功能,算法通过迭代器对容器中的数据进行查找、计算…… 。
  • 函数对象:重载了括号运算符()的模板类,为算法提供灵活的策略 。
  • 适配器:通过对已有的容器、迭代器、函数对象进行适配,创造出新的编程组件 。
  • 配置器:为容器服务,负责其内存空间的配置与管理 。
6大部件遵循单一职责设计思想,组件与组件之间彼此独立,每一个组件在各自内部高度自治性地实现分配到的功能 。
各组件在合作关系上 , 互为依赖,相互之间形成服务与被服务关系 。从而构建出一个精密、灵活、具有高度自适应的编程环境 。
如下图为组件之间的分工合作关系:
C++ STL 概述_严丝合缝的合作者们

文章插图
学习STL包括:
  • 了解、熟悉各组件的使用 。
  • 掌握各组件之间的服务关系 。
STL知识体系庞大而复杂,非一言二语能讲透 。本文仅俯瞰一下STL , 对STL有一个大概了解 , 对每一个组件的细节讨论将留到系列文章中讲解 。
下面通过一个简单的案例初步了解容器、迭代器、算法、函数对象之间的合作关系 。
案例需求:求解一个已知数列中的所有质数(质数:只能被 1 和自身整除的数字) 。
设计流程:
  • 首先在源代码文件的头部包含程序中需要用到的所有头文件 。
#include <iostream>#include <vector>#include <algorithm>#include <cmath>using namespace std;
  • 认识STLvector容器 , 使用它存储已知数列 。
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>());
  • 输出结果 。

C++ STL 概述_严丝合缝的合作者们

文章插图
STL使用了高内聚、低耦合的设计理念,各组件的专业能力非常强,合作时又能做到严丝合缝、润物细无声 。