初探STL之算法
算法
STL算法部分主要由頭文件<algorithm>,<numeric>,<functional>組成。要使用 STL中的算法函數必須包括頭文件<algorithm>,對於數值算法須包括<numeric>,<functional>中則定義了一些模板類,用來聲明函數對象。
分類
STL中算法大致分為四類:
1、非可變序列算法:指不直接改動其所操作的容器內容的算法。
2、可變序列算法:指能夠改動它們所操作的容器內容的算法。
3、排序算法:包含對序列進行排序和合並的算法、搜索算法以及有序序列上的集合操作。
4、數值算法:對容器內容進行數值計算。
下面對全部算法進行仔細分類並標明功能:
算法介紹
查找算法
<一>查找算法(13個):推斷容器中是否包括某個值
adjacent_find: 在iterator對標識元素範圍內。查找一對相鄰反復元素。找到則返回指向這對元素的第一個元素的
ForwardIterator。
否則返回last。重載版本號使用輸入的二元操作符取代相等的推斷。
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函數
#include <vector> #include <algorithm> #include <iostream> using namespace std; int main( ) { vector<int> intv; for(int i=0;i<10;i++) intv.push_back(i); vector<int>::iterator inti; inti=find(intv.begin(),intv.end(),50); if(inti==intv.end()) cout<<"沒有找到匹配的值"; else cout<<"找到了匹配的值"; cout<<endl; inti=find(intv.begin(),intv.end(),5); if(inti==intv.end()) cout<<"沒有找到匹配的值"; else cout<<"找到了匹配的值"; return 0; }
輸出:
沒有找到匹配的值
找到了匹配的值
find if 函數
#include "stdafx.h" #include <vector> #include <algorithm> #include <iostream> using namespace std; bool greater5(int i) { return i>5; } int main( ) { vector<int> intv; for(int i=0;i<10;i++) intv.push_back(i); vector<int>::iterator inti; inti=find_if(intv.begin(),intv.end(),greater5); if(inti==intv.end()) cout<<"沒有比5大的值"; else cout<<"第一個比5大的值是 :"<<*inti; //輸出6 getchar(); return 0; }
copy函數
#include "stdafx.h" #include <vector> #include <list> #include <algorithm> #include <iostream> using namespace std; int main(int argc, _TCHAR* argv[]) { vector<int> intv; intv.push_back(2); intv.push_back(5); intv.push_back(3); list<int> intl; list<int>::iterator intliter; intl.push_back(6); intl.push_back(7); intl.push_back(8); intl.push_back(80); copy(intv.begin(),intv.end(),intl.begin()); for(intliter=intl.begin();intliter!=intl.end();intliter++) cout<<*intliter<<" "; getchar(); return 0; }
輸出:
2 5 3 80
repalce函數
#include "stdafx.h" #include <vector> #include <algorithm> #include <iostream> using namespace std; int main() { vector<int> intv; vector<int>::iterator intviter; intv.push_back(2); intv.push_back(5); intv.push_back(3); intv.push_back(50); intv.push_back(500); replace(intv.begin(),intv.end(),5,6); for(intviter=intv.begin();intviter!=intv.end();intviter++) cout<<*intviter<<" "; getchar(); }
輸出:
2 6 3 50 500
初探STL之算法