C++ STL算法
STL 提供了大量操作容器的算法,這些算法大致可以分為:排序、搜索、集合運(yùn)算、數(shù)值處理和拷貝等,這些算法的實(shí)現(xiàn)是采用函數(shù)模板來實(shí)現(xiàn)的,函數(shù)模板類似于類模板。對于 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 );//生成隨機(jī)數(shù)字,填充numgenerate( num.begin(), num.end(), rand );//將其中的奇數(shù)全部替換我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() 函數(shù)前面兩個參數(shù)均為迭代器,分別指向開頭和結(jié)尾,通過這兩個迭代器,我們可以為 num 的 10 個元素賦值。由于 num 是整型的 vector 實(shí)例,因此要求 generate() 函數(shù)的第三個參數(shù)返回值也為整型,因此我們將庫函數(shù) rand() 作為第三個參數(shù),用于生成隨機(jī)數(shù),其返回值是整型。調(diào)用完 generate() 函數(shù)之后,num 中就填充了一些隨機(jī)數(shù)值。
replace_if() 前面兩個參數(shù)還是兩個迭代器,通過這兩個迭代器我們可以對 num() 進(jìn)行遍歷,遍歷過程中會逐一判斷元素是否為奇數(shù),如果為奇數(shù),則將其換為 0。Replace_if() 要求第三個參數(shù)為一個返回 bool 類型的函數(shù),為此我們專門設(shè)計了一個 odd() 函數(shù),用于判斷數(shù)值是否為奇數(shù),如果為奇數(shù)則返回 true,否則返回 false。因?yàn)?num 為 int 型 vector 實(shí)例,因此要求用來替換的元素也必須為 int 型,故 replace_if() 函數(shù)最后一個參數(shù)必須為 int 型,在本例中我們直接使用 0。
接著我們對 num 進(jìn)行排序,sort() 函數(shù)前面兩個參數(shù)仍然是迭代器,第三個參數(shù)是可選的,默認(rèn)情況下 sort() 將會以升序進(jìn)行排序。本例中使用了第三個參數(shù),第三個參數(shù)為 compare() 函數(shù)的函數(shù)名。因?yàn)?num 為整型實(shí)例,因此 compare() 函數(shù)的兩個參數(shù)為整型的引用。同時由于 sort() 函數(shù)要求第三個參數(shù)為返回一個 bool 類型的函數(shù),因此 compare() 也必須返回 bool 類型。本例中我們希望 num 以降序的方式排列,因此我們 compare() 函數(shù)返回“a > b”。當(dāng)我們返回“a < b”或者根本就不提供第三個參數(shù)時,函數(shù)將會以升序的形式排列 num。
最后為了打印 num 中的所有元素,我們使用了 for_each() 函數(shù),當(dāng)然如果使用循環(huán)根據(jù)下標(biāo)或使用迭代器都是可以打印 num 中的元素的,只不過我們是想介紹一下 for_each() 函數(shù)而已。for_each() 函數(shù)前面兩個參數(shù)仍然是兩個迭代器,通過這兩個迭代器,我們就可以遍歷 num 中的元素。for_each() 函數(shù)第三個參數(shù)用來完成打印操作,我們定義了一個 display() 函數(shù)用于完成此操作。
在整個程序中我們一直沒有使用任何循環(huán)就完成了整個操作,這是因?yàn)檫@四個函數(shù)中分別定義了內(nèi)建的迭代操作,而我們只需要指明迭代的起始和終止位置即可。
STL 中還提供了很多其它的算法,在今后的學(xué)習(xí)過程中,大家如果有需要可以去查找 C++ 的類庫手冊。
總結(jié)
- 上一篇: C++输入输出类的层次
- 下一篇: C++ 中的集合与字典