初探STL之算法

STL算法部分主要由頭文件 , , 組成。要使用 STL中的算法函數必須包含頭文件 ,對於數值算法須包含 中則定義了一些模板類,用來聲明函數對象。 ios

分類算法

STL中算法大體分爲四類:
一、非可變序列算法:指不直接修改其所操做的容器內容的算法。
二、可變序列算法:指能夠修改它們所操做的容器內容的算法。
三、排序算法:包括對序列進行排序和合並的算法、搜索算法以及有序序列上的集合操做。
四、數值算法:對容器內容進行數值計算。dom

如下對全部算法進行細緻分類並標明功能:函數

算法介紹spa

查找算法指針

<一>查找算法(13個):判斷容器中是否包含某個值code

adjacent_find: 在iterator對標識元素範圍內,查找一對相鄰重複元素,找到則返回指向這對元素的第一個元素的

ForwardIterator。不然返回last。重載版本使用輸入的二元操做符代替相等的判斷。orm

binary_search: 在有序序列中查找value,找到返回true。重載的版本實用指定的比較函數對象或函數指針來判斷

相等。對象

count: 利用等於操做符,把標誌範圍內的元素與輸入值比較,返回相等元素個數。
count_if: 利用輸入的操做符,對標誌範圍內的元素進行操做,返回結果爲true的個數。


equal_range: 功能相似equal,返回一對iterator,第一個表示lower_bound,第二個表示upper_bound。


find: 利用底層元素的等於操做符,對指定範圍內的元素與輸入值進行比較。當匹配時,結束搜索,返回該元素的一個InputIterator。
find_end: 在指定範圍內查找"由輸入的另一對iterator標誌的第二個序列"的最後一次出現。找到則返回最後一對的第一個ForwardIterator,不然返回輸入的"另一對"的第一個ForwardIterator。重載版本使用用戶輸入的操做符代替等於操做。
find_first_of: 在指定範圍內查找"由輸入的另一對iterator標誌的第二個序列"中任意一個元素的第一次出現。重載版本中使用了用戶自定義操做符。
find_if: 使用輸入的函數代替等於操做符執行find。


lower_bound: 返回一個ForwardIterator,指向在有序序列範圍內的能夠插入指定值而不破壞容器順序的第一個位置。重載函數使用自定義比較操做。
upper_bound: 返回一個ForwardIterator,指向在有序序列範圍內插入value而不破壞容器順序的最後一個位置,該位置標誌一個大於value的值。重載函數使用自定義比較操做。
search: 給出兩個範圍,返回一個ForwardIterator,查找成功指向第一個範圍內第一次出現子序列(第二個範圍)的位置,查找失敗指向last1。重載版本使用自定義的比較操做。


search_n:在指定範圍內查找val出現n次的子序列。重載版本使用自定義的比較操做。

排序和通用算法排序

<二>排序和通用算法(14個):提供元素排序策略

inplace_merge:  合併兩個有序序列,結果序列覆蓋兩端範圍。重載版本使用輸入的操做進行排序。
merge:合併兩個有序序列,存放到另外一個序列。重載版本使用自定義的比較。


nth_element:              將範圍內的序列從新排序,使全部小於第n個元素的元素都出如今它前面,而大於它的都出如今後面。重載版本使用自定義的比較操做。


partial_sort:對序列作部分排序,被排序元素個數正好能夠被放到範圍內。重載版本使用自定義的比較操做。
partial_sort_copy: 與partial_sort相似,不過將通過排序的序列複製到另外一個容器。
partition: 對指定範圍內元素從新排序,使用輸入的函數,把結果爲true的元素放在結果爲false的元素以前。


random_shuffle: 對指定範圍內的元素隨機調整次序。重載版本輸入一個隨機數產生操做。


reverse: 將指定範圍內元素從新反序排序。
reverse_copy:  與reverse相似,不過將結果寫入另外一個容器。


rotate: 將指定範圍內元素移到容器末尾,由middle指向的元素成爲容器第一個元素。
rotate_copy: 與rotate相似,不過將結果寫入另外一個容器。


sort: 以升序從新排列指定範圍內的元素。重載版本使用自定義的比較操做。


stable_sort:  與sort相似,不過保留相等元素之間的順序關係。
stable_partition: 與partition相似,不過不保證保留容器中的相對順序。

刪除和替換算法

<三>刪除和替換算法(15個)
copy: 複製序列
copy_backward: 與copy相同,不過元素是以相反順序被拷貝。

iter_swap: 交換兩個ForwardIterator的值。


remove: 刪除指定範圍內全部等於指定元素的元素。注意,該函數不是真正刪除函數。內置函數不適合使用remove和remove_if函數。
remove_copy:將全部不匹配元素複製到一個制定容器,返回OutputIterator指向被拷貝的末元素的下一個位置。
remove_if:  刪除指定範圍內輸入操做結果爲true的全部元素。
remove_copy_if:  將全部不匹配元素拷貝到一個指定容器。


replace:  將指定範圍內全部等於vold的元素都用vnew代替。
replace_copy:  與replace相似,不過將結果寫入另外一個容器。
replace_if: 將指定範圍內全部操做結果爲true的元素用新值代替。
replace_copy_if: 與replace_if,不過將結果寫入另外一個容器。


swap:   交換存儲在兩個對象中的值。
swap_range:   將指定範圍內的元素與另外一個序列元素值進行交換。


unique:  清除序列中重複元素,和remove相似,它也不能真正刪除元素。重載版本使用自定義比較操做。
unique_copy:  與unique相似,不過把結果輸出到另外一個容器。

排列組合算法

<四>排列組合算法(2個):提供計算給定集合按必定順序的全部可能排列組合

next_permutation: 取出當前範圍內的排列,並從新排序爲下一個排列。重載版本使用自定義的比較操做。
prev_permutation:取出指定範圍內的序列並將它從新排序爲上一個序列。若是不存在上一個序列則返回false。重載版本使用自定義的比較操做。

算術算法

<五>算術算法(4個)

accumulate:  iterator對標識的序列段元素之和,加到一個由val指定的初始值上。重載版本再也不作加法,而是傳進來的二元操做符被應用到元素上。
partial_sum:  建立一個新序列,其中每一個元素值表明指定範圍內該位置前全部元素之和。重載版本使用自定義操做代替加法。
inner_product:對兩個序列作內積(對應元素相乘,再求和)並將內積加到一個輸入的初始值上。重載版本使用用戶定義的操做。
adjacent_difference:   建立一個新序列,新序列中每一個新值表明當前元素與上一個元素的差。重載版本用指定二元操做計算相鄰元素的差。

生成和異變算法

<六>生成和異變算法(6個)

fill:    將輸入值賦給標誌範圍內的全部元素。
fill_n:    將輸入值賦給first到first+n範圍內的全部元素。
for_each:  用指定函數依次對指定範圍內全部元素進行迭代訪問,返回所指定的函數類型。該函數不得修改序列中的元素。


generate:  連續調用輸入的函數來填充指定的範圍。
generate_n:  generate函數相似,填充從指定iterator開始的n個元素。
transform:   將輸入的操做做用與指定範圍內的每一個元素,併產生一個新的序列。重載版本將操做做用在一對元素上,另一個元素來自輸入的另一個序列。結果輸出到指定容器。

關係算法

<七>關係算法(8個)

equal:  若是兩個序列在標誌範圍內元素都相等,返回true。重載版本使用輸入的操做符代替默認的等於操做符。


includes:   判斷第一個指定範圍內的全部元素是否都被第二個範圍包含,使用底層元素的<操做符,成功返回true。重載版本使用用戶輸入的函數。


lexicographical_compare:  比較兩個序列。重載版本使用用戶自定義比較操做。


max: 返回兩個元素中較大一個。重載版本使用自定義比較操做。
max_element: 返回一個ForwardIterator,指出序列中最大的元素。重載版本使用自定義比較操做。
min:      返回兩個元素中較小一個。重載版本使用自定義比較操做。
min_element: 返回ForwardIterator,指出序列中最小的元素。重載版本使用自定義比較操做。


mismatch:  並行比較兩個序列,指出第一個不匹配的位置,返回一對iterator,標誌第一個不匹配元素位置。若是都匹配,返回每一個容器的last。重載版本使用自定義的比較操做。

集合算法

<八>集合算法(4個)

set_union: 構造一個有序序列,包含兩個序列中全部的不重複元素。重載版本使用自定義的比較操做。
set_intersection: 構造一個有序序列,其中元素在兩個序列中都存在。重載版本使用自定義的比較操做。
set_difference:  構造一個有序序列,該序列僅保留第一個序列中存在的而第二個中不存在的元素。重載版本使用自定義的比較操做。
set_symmetric_difference: 構造一個有序序列,該序列取兩個序列的對稱差集(並集-交集)。

堆算法

<九>堆算法(4個)
make_heap: 把指定範圍內的元素生成一個堆。重載版本使用自定義比較操做。
pop_heap: 並不真正把最大元素從堆中彈出,而是從新排序堆。它把first和last-1交換,而後從新生成一個堆。可以使用容器的back來訪問被"彈出"的元素或者使用pop_back進行真正的刪除。重載版本使用自定義的比較操做。
push_heap: 假設first到last-1是一個有效堆,要被加入到堆的元素存放在位置last-1,從新生成堆。在指向該函數前,必須先把元素插入容器後。重載版本使用指定的比較操做。
sort_heap: 對指定範圍內的序列從新排序,它假設該序列是個有序堆。重載版本使用自定義比較操做。

**舉例:

find函數**

01.#include <vector>  
02.#include <algorithm>  
03.#include <iostream>  
04.using namespace std;  
05.  
06.  
07.int main( )  
08.{  
09.    vector<int> intv;  
10.    for(int i=0;i<10;i++)  
11.        intv.push_back(i);  
12.  
13.    vector<int>::iterator inti;  
14.    inti=find(intv.begin(),intv.end(),50);  
15.    if(inti==intv.end())  
16.        cout<<"沒有找到匹配的值";  
17.    else  
18.        cout<<"找到了匹配的值";  
19.    cout<<endl;  
20.  
21.    inti=find(intv.begin(),intv.end(),5);  
22.    if(inti==intv.end())  
23.        cout<<"沒有找到匹配的值";  
24.    else  
25.        cout<<"找到了匹配的值";  
26.  
27.  
28.    return 0;  
29.}

輸出:
沒有找到匹配的值
找到了匹配的值

find if 函數

01.#include "stdafx.h"  
02.#include <vector>  
03.#include <algorithm>  
04.#include <iostream>  
05.using namespace std;  
06.bool greater5(int i)  
07.{  
08.    return i>5;  
09.}  
10.  
11.  
12.int main( )  
13.{  
14.    vector<int> intv;  
15.    for(int i=0;i<10;i++)  
16.        intv.push_back(i);  
17.      
18.    vector<int>::iterator inti;  
19.    inti=find_if(intv.begin(),intv.end(),greater5);  
20.    if(inti==intv.end())  
21.        cout<<"沒有比5大的值";  
22.    else  
23.        cout<<"第一個比5大的值是 :"<<*inti;   //輸出6  
24.  
25.   getchar();  
26.   return 0;  
27.}

copy函數

01.#include "stdafx.h"  
02.#include <vector>  
03.#include <list>  
04.#include <algorithm>  
05.#include <iostream>  
06.using namespace std;  
07.  
08.int main(int argc, _TCHAR* argv[])  
09.{  
10.    vector<int> intv;  
11.    intv.push_back(2);  
12.    intv.push_back(5);  
13.    intv.push_back(3);  
14.  
15.    list<int> intl;  
16.    list<int>::iterator intliter;  
17.    intl.push_back(6);  
18.    intl.push_back(7);  
19.    intl.push_back(8);  
20.    intl.push_back(80);  
21.  
22.    copy(intv.begin(),intv.end(),intl.begin());  
23.    for(intliter=intl.begin();intliter!=intl.end();intliter++)  
24.        cout<<*intliter<<"   ";  
25.  
26.  getchar();  
27.    return 0;  
28.}

輸出:
2 5 3 80

repalce函數

01.#include "stdafx.h"  
02.#include <vector>  
03.#include <algorithm>  
04.#include <iostream>  
05.using namespace std;  
06.int main()  
07.{  
08.    vector<int> intv;  
09.    vector<int>::iterator intviter;  
10.    intv.push_back(2);  
11.    intv.push_back(5);  
12.    intv.push_back(3);  
13.    intv.push_back(50);  
14.    intv.push_back(500);  
15.      
16.    replace(intv.begin(),intv.end(),5,6);  
17.    for(intviter=intv.begin();intviter!=intv.end();intviter++)  
18.        cout<<*intviter<<"   ";  
19.  
20.   getchar();  
21.}

輸出: 2 6 3 50 500

相關文章
相關標籤/搜索