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使用了高內聚、低耦合的設計理念,各組件的專業能力非常強,合作時又能做到嚴絲合縫、潤物細無聲 。