有了函數模板和類模板機制,就可以編寫出通用的函數和類,如通用數組類、通用排序函數等。既然這些函數模板和類模板非常通用,那麼,我們每個程序員都勞心費力一遍遍地重複製造輪子似乎沒有必要,C++語言也考慮到了這一點。
1 標準模板庫STL
C++利用模板機制,實現了計算機科學領域常用的算法和通用數據結構,形成了具有工業級強度、健壯可靠的函數模板和類模板集合,稱為標準模板庫(Standard Template Libarary)。
C++的標準模板庫STL,是一個函數模板和類模板的集合,這些模板從功能上劃分為六個邏輯組件:
容器(Container)
迭代器(Iterator)
算法(Algorithm)
仿函數(Function object)
迭代適配器(Adaptor)
空間配製器(allocator)
(前面三個是最主要的邏輯組件)
利用容器、算法、迭代器,我們可以:
1.1 把需要處理的數據或者對象放到容器中,進行有效的組織和存儲。容器是實現各種數據結構的類模板集合,如vector、list、map等。
1.2 利用迭代器對容器中的元素進行存取訪問。C++的迭代器是訪問容器的泛型指針類模板,每種容器均附帶自身的迭代器。
1.3 通過迭代器指定容器區間範圍,利用算法對該區間範圍內的容器元素進行操作和處理。算法是一組常用函數模板,如sort、find、copy等。
它們之間的配合關係如下圖:
在上圖中,容器中存儲了一組整數,end表示容器最後一個元素的下一個位置。迭代器A指向容器的首元素,迭代器B指向容器尾元素的下一個位置,可以看出由迭代器A和迭代器B構成了一個左閉右開的容器區間[迭代器A,迭代器B)。然後,將此區間交給算法sort完成容器元素的排序工作。
因此,使用標準模板庫STL編寫程序的一般模式是:
首先利用容器模板構造出容器對象,把數據或對象放入容器;然後,使用迭代器構造出容器的區間範圍;最後,把容器區間範圍交給算法,由算法對區間範圍內的容器元素進行操作和處理。
2 利用STL求解問題
如有給定的一組字符串,要求計算出有多少個字符串以字母S打頭。問題求解思路是先用一個容器存放字符串,然後通過迭代器遍歷容器對以S打頭的字符串計數。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <conio.h>
using namespace std;
bool MatchFirstChar(const string &str) { return 'S' == str[0];} //謂詞函數
int main(){
const int VECTOR_SIZE=8;
string names[]={"She","Sells","Sea","Shells","by","the","Sea","Shores"};
//產生容納字符串的向量容器對象
vector<string>NamesVect(names,names+VECTOR_SIZE);
//定義迭代器對象,[start,end)定義了一個左開右閉區間
vector<string>::iterator start,end;
start=NamesVect.begin();
end=NamesVect.end();
//利用迭代器在[start,end)區間遍歷向量容器,輸出容器元素
cout<<"NamesVect{";
for(vector<string>::iterator it=start;it !=end; it++)
cout<<*it<<" ";
cout<<"}\n"<<endl;
//調用count_if計數向量容器中使用MatchFirstChar);
int result = count_if(start,end,MatchFirstChar);//計算以's'開頭的字符串
cout<<"個數="<<result<<endl;
getch();
return 0;
}
運算結果:
NamesVect{She Sells Sea Shells by the Sea Shores }
個數=6
閱讀程序代碼不難看出:使用標準模板庫中的容器和算法,可以大大簡化程序的邏輯。核心邏輯就是把字符串放到vector容器中,通過迭代器構造遍歷容器的迭代器區間範圍,然後用count_if函數遍歷容器並計算。