C++ STL算法
STL 提供了大量操作容器的算法,這些算法大致可以分為:排序、搜索、集合運算、數值處理和拷貝等,這些算法的實現是采用函數模板來實現的,函數模板類似于類模板。對于 STL 算法而言,算法是一樣的,只是所處理的容器不同,只要使用合適的迭代器,就可以直接用算法操作容器了。
#include <iostream> #include <vector> #include <algorithm> using namespace std; bool compare( const int & a, const int & b) {return a > b; } void display( int i ) {cout<< i << " "; } bool odd( int i ) {return i % 2 != 0; } int main() {vector < int > num ( 10 );//生成隨機數字,填充numgenerate( num.begin(), num.end(), rand );//將其中的奇數全部替換我0replace_if( num.begin(), num.end(), odd, 0 );//從大到小排序sort( num.begin(), num.end(), compare );for_each( num.begin(), num.end(), display );cout << endl;return 0; }如果我們需要使用 STL 算法,則需要在頭文件中包括頭文件,在本程序中使用了四種 STL 算法:generate()、replace_if()、sort() 和 for_each()。下面我們來一一了解這四種算法的功能。
generate() 函數前面兩個參數均為迭代器,分別指向開頭和結尾,通過這兩個迭代器,我們可以為 num 的 10 個元素賦值。由于 num 是整型的 vector 實例,因此要求 generate() 函數的第三個參數返回值也為整型,因此我們將庫函數 rand() 作為第三個參數,用于生成隨機數,其返回值是整型。調用完 generate() 函數之后,num 中就填充了一些隨機數值。
replace_if() 前面兩個參數還是兩個迭代器,通過這兩個迭代器我們可以對 num() 進行遍歷,遍歷過程中會逐一判斷元素是否為奇數,如果為奇數,則將其換為 0。Replace_if() 要求第三個參數為一個返回 bool 類型的函數,為此我們專門設計了一個 odd() 函數,用于判斷數值是否為奇數,如果為奇數則返回 true,否則返回 false。因為 num 為 int 型 vector 實例,因此要求用來替換的元素也必須為 int 型,故 replace_if() 函數最后一個參數必須為 int 型,在本例中我們直接使用 0。
接著我們對 num 進行排序,sort() 函數前面兩個參數仍然是迭代器,第三個參數是可選的,默認情況下 sort() 將會以升序進行排序。本例中使用了第三個參數,第三個參數為 compare() 函數的函數名。因為 num 為整型實例,因此 compare() 函數的兩個參數為整型的引用。同時由于 sort() 函數要求第三個參數為返回一個 bool 類型的函數,因此 compare() 也必須返回 bool 類型。本例中我們希望 num 以降序的方式排列,因此我們 compare() 函數返回“a > b”。當我們返回“a < b”或者根本就不提供第三個參數時,函數將會以升序的形式排列 num。
最后為了打印 num 中的所有元素,我們使用了 for_each() 函數,當然如果使用循環根據下標或使用迭代器都是可以打印 num 中的元素的,只不過我們是想介紹一下 for_each() 函數而已。for_each() 函數前面兩個參數仍然是兩個迭代器,通過這兩個迭代器,我們就可以遍歷 num 中的元素。for_each() 函數第三個參數用來完成打印操作,我們定義了一個 display() 函數用于完成此操作。
在整個程序中我們一直沒有使用任何循環就完成了整個操作,這是因為這四個函數中分別定義了內建的迭代操作,而我們只需要指明迭代的起始和終止位置即可。
STL 中還提供了很多其它的算法,在今后的學習過程中,大家如果有需要可以去查找 C++ 的類庫手冊。
總結
- 上一篇: C++输入输出类的层次
- 下一篇: C++ 中的集合与字典