C++|標準模板庫STL及利用STL求解問題

數據結構 程序員 技術 小智雅匯 2017-06-07

有了函數模板和類模板機制,就可以編寫出通用的函數和類,如通用數組類、通用排序函數等。既然這些函數模板和類模板非常通用,那麼,我們每個程序員都勞心費力一遍遍地重複製造輪子似乎沒有必要,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等。

它們之間的配合關係如下圖:

C++|標準模板庫STL及利用STL求解問題

在上圖中,容器中存儲了一組整數,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函數遍歷容器並計算。

相關推薦

推薦中...