STL算法学习[转]
原文:http://www.cppblog.com/mzty/archive/2007/03/14/19819.html
STL算法學習,小結如下:
前提:
下載stl源碼: ?http://www.sgi.com/tech/stl/download.html
打開網頁:?????http://www.sgi.com/tech/stl/stl_index.html
一?? 函數對象: 因為很多的算法中多使用了函數對象
二元函數對象,V1和V2為輸入,V3為結果
plus<T>:
? transform(V1.begin(), V1.end(), V2.begin(), V3.begin(),plus<double>());
其他的二元函數對象:minus,multiples,divieds,modulus.
二元斷言函數對象,使用時需要bind2nd()或bind1st()來綁定比較對象。
less<T>:
? find_if(L.begin(), L.end(), bind2nd(less<int>(), 0));
其他的二元斷言函數:equal_to,notequal_to,greater,greater_equal,less_equal,logical_and,logical_or
二元邏輯函數
binary_negate:
const char* wptr = find_if(str, str + MAXLEN,
?????????????????????????? compose2(not2(logical_or<bool>()),
??????????????????????????????????? bind2nd(equal_to<char>(), ' '),
??????????????????????????????????? bind2nd(equal_to<char>(), '\n')));
一元函數對象
negate:
transform(V1.begin(), V1.end(), V2.begin(),
????????? negate<int>());
一元斷定函數對象
logical_not:
? transform(V.begin(), V.end(), V.begin(), logical_not<bool>());
一元邏輯函數
unary_negate:
二?? 函數對象發生器:主要用來填充序列。
產生不重復的隨機數:
// Generate unique random numbers from 0 to mod:
class URandGen {
? std::set<int> used;
? int limit;
public:
? URandGen(int lim) : limit(lim) {
??? srand(time(0));
? }
? int operator()() {
??? while(true) {
????? int i = int(rand()) % limit;
????? if(used.find(i) == used.end()) {
??????? used.insert(i);
??????? return i;
????? }
??? }
? }
};
const int sz = 10;
const int max = 50;
vector<int> x(sz), y(sz), r(sz);
//An integer random number generator:
URandGen urg(max);
generate_n(x.begin(), sz, urg);
三 函數對象適配器 : 將函數轉化為函數對象
ptr_fun:一般函數適配器
一元實例:
transform(first, last, first,
????????? compose1(negate<double>, ptr_fun(fabs)));
二元實例:
list<char*>::iterator item =?
????????????? find_if(L.begin(), L.end(),
????????????????????? not1(binder2nd(ptr_fun(strcmp), "OK")));
not1:對一元的斷定函數對象取反的適配器。
not2: 對二元的斷定函數對象取反的適配器。
mem_fun與mem_fun_ref:類成員函數的適配器,區別是一個需要指針,而另一個僅需要一般對象。如下:
shape是一個指針變量,則foreach(v.begin(),v.end(),mem_fun(&shape::draw));
但如果shape是一般的變量,不是指針,則foreach(v.begin(),v.end(),mem_fun_ref(&shape::draw));
四?? 算法:
拷貝:
copy()
reverse_copy()
rotate_copy()
remove_copy()? 拷貝不等于某值的元素到另一個序列。
remove_copy_if() 拷貝符合條件的到另一個序列。
填充和生成:
fill()
fill_n() 填充序列中的n個元素。
generate()為序列中的每個元素調用gen()函數。
排列:
next_permuttion() 后一個排列。
prev_permutation()
partition() 劃分,將滿足條件的元素移動到序列的前面。
stable_partition()
查找和替換:
find()
binary_search() 在一個已經有順序的序列上查找。
find_if()
search() 檢查第二個序列是否在第一個序列中出現,且順序相同。
刪除:注意必須調用erase()來真正刪除
remove()
unique()刪除相鄰重復元素,最好現排序。
合并序列:
merge()
數值算法:
accumulate() 對序列的每個元素進行運算后求和。
transform() 也可以對每個元素進行運算。
計數:
size()總個數。
count()等于某值的元素個數。
adjacent_difference 序列中的后一個減前與他相鄰的前一個得到新的序列。
adiacent_find
五?? 所有的算法:
?????accumlate?:?iterator?對標志的序列中的元素之和,加到一個由?init?指定的初始值上。重載的版本不再做加法,而是傳進來的二元操作符被應用到元素上。?
adjacent_different?:創建一個新序列,該序列的每個新值都代表了當前元素與上一個元素的差。重載版本用指定的二元操作計算相鄰元素的差。?
adjacent_find?:在?iterator?對標志的元素范圍內,查找一對相鄰的重復元素,如果找到返回一個?ForwardIterator?,指向這對元素的第一個元素。否則返回?last?。重載版本使用輸入的二元操作符代替相等的判斷。?
binary_search?:在有序序列中查找?value?,如果找到返回?true?。重載的版本使用指定的比較函數對象或者函數指針來判斷相等。?
copy?:復制序列。?
copy_backward?:除了元素以相反的順序被拷貝外,別的和?copy?相同。?
count?:利用等于操作符,把標志范圍類的元素與輸入的值進行比較,并返回相等元素的個數。?
count_if?:對于標志范圍類的元素,應用輸入的操作符,并返回結果為?true?的次數。?
equal?:如果兩個序列在范圍內的元素都相等,則?equal?返回?true?。重載版本使用輸入的操作符代替了默認的等于操作符。?
equal_range?:返回一對?iterator?,第一個?iterator?表示由?lower_bound?返回的?iterator?,第二個表示由?upper_bound?返回的?iterator值。?
fill?:將輸入的值的拷貝賦給范圍內的每個元素。?
fill_n?:將輸入的值賦值給?first?到?frist+n?范圍內的元素。?
find?:利用底層元素的等于操作符,對范圍內的元素與輸入的值進行比較。當匹配時,結束搜索,返回該元素的一個?InputIterator?。?
find_if?:使用輸入的函數替代了等于操作符執行了?find?。?
find_end?:在范圍內查找“由輸入的另外一個?iterator?對標志的第二個序列”的最后一次出現。重載版本中使用了用戶輸入的操作符替代等于操作。?
find_first_of?:在范圍內查找“由輸入的另外一個?iterator?對標志的第二個序列”中的任意一個元素的第一次出現。重載版本中使用了用戶自定義的操作符。?
for_each?:依次對范圍內的所有元素執行輸入的函數。?
generate?:通過對輸入的函數?gen?的連續調用來填充指定的范圍。?
generate_n?:填充?n?個元素。?
includes?:判斷?[first1, last1)?的一個元素是否被包含在另外一個序列中。使用底層元素的?<=?操作符,重載版本使用用戶輸入的函數。?
inner_product?:對兩個序列做內積?(?對應的元素相乘,再求和?)?,并將內積加到一個輸入的的初始值上。重載版本使用了用戶定義的操作。?
inner_merge?:合并兩個排過序的連續序列,結果序列覆蓋了兩端范圍,重載版本使用輸入的操作進行排序。?
iter_swap?:交換兩個?ForwardIterator?的值。?
lexicographical_compare?:比較兩個序列。重載版本使用了用戶自定義的比較操作。?
lower_bound?:返回一個?iterator?,它指向在范圍內的有序序列中可以插入指定值而不破壞容器順序的第一個位置。重載函數使用了自定義的比較操作。?
max?:返回兩個元素中的較大的一個,重載版本使用了自定義的比較操作。?
max_element?:返回一個?iterator?,指出序列中最大的元素。重載版本使用自定義的比較操作。?
min?:兩個元素中的較小者。重載版本使用自定義的比較操作。?
min_element?:類似與?max_element?,不過返回最小的元素。?
merge?:合并兩個有序序列,并存放到另外一個序列中。重載版本使用自定義的比較。?
mismatch?:并行的比較兩個序列,指出第一個不匹配的位置,它返回一對?iterator?,標志第一個不匹配的元素位置。如果都匹配,返回每個容器的?last?。重載版本使用自定義的比較操作。?
next_permutation?:取出當前范圍內的排列,并將其重新排序為下一個排列。重載版本使用自定義的比較操作。?
nth_element?:將范圍內的序列重新排序,使所有小于第?n?個元素的元素都出現在它前面,而大于它的都出現在后面,重載版本使用了自定義的比較操作。?
partial_sort?:對整個序列做部分排序,被排序元素的個數正好可以被放到范圍內。重載版本使用自定義的比較操作。?
partial_sort_copy?:與?partial_sort?相同,除了將經過排序的序列復制到另外一個容器。?
partial_sum?:創建一個新的元素序列,其中每個元素的值代表了范圍內該位置之前所有元素之和。重載版本使用了自定義操作替代加法。?
partition?:對范圍內元素重新排序,使用輸入的函數,把計算結果為?true?的元素都放在結果為?false?的元素之前。?
prev_permutation?:取出范圍內的序列并將它重新排序為上一個序列。如果不存在上一個序列則返回?false?。重載版本使用自定義的比較操作。?
random_shuffle?:對范圍內的元素隨機調整次序。重載版本輸入一個隨機數產生操作。?
remove?:刪除在范圍內的所有等于指定的元素,注意,該函數并不真正刪除元素。內置數組不適合使用?remove?和?remove_if?函數。?
remove_copy?:將所有不匹配的元素都復制到一個指定容器,返回的?OutputIterator?指向被拷貝的末元素的下一個位置。?
remove_if?:刪除所有范圍內輸入操作結果為?true?的元素。?
remove_copy_if?:將所有不匹配的元素拷貝到一個指定容器。?
replace?:將范圍內的所有等于?old_value?的元素都用?new_value?替代。?
replace_copy?:與?replace?類似,不過將結果寫入另外一個容器。?
replace_if?:將范圍內的所有操作結果為?true?的元素用新值替代。?
replace_copy_if?:類似與?replace_if?,不過將結果寫入另外一個容器。?
reverse?:將范圍內元素重新按反序排列。?
reverse_copy?:類似與?reverse?,不過將結果寫入另外一個容器。?
rotate?:將范圍內的元素移到容器末尾,由?middle?指向的元素成為容器第一個元素。?
rotate_copy?:類似與?rotate?,不過將結果寫入另外一個容器。?
search?:給出了兩個范圍,返回一個?iterator?,指向在范圍內第一次出現子序列的位置。重載版本使用自定義的比較操作。?
search_n?:在范圍內查找?value?出現?n?次的子序列。重載版本使用自定義的比較操作。?
set_difference?:構造一個排過序的序列,其中的元素出現在第一個序列中,但是不包含在第二個序列中。重載版本使用自定義的比較操作。?
set_intersection?:構造一個排過序的序列,其中的元素在兩個序列中都存在。重載版本使用自定義的比較操作。?
set_symmetric_difference?:構造一個排過序的序列,其中的元素在第一個序列中出現,但是不出現在第二個序列中。重載版本使用自定義的比較操作。?
set_union?:構造一個排過序的序列,它包含兩個序列中的所有的不重復元素。重載版本使用自定義的比較操作。?
sort?:以升序重新排列范圍內的元素,重載版本使用了自定義的比較操作。?
stable_partition?:與?partition?類似,不過它不保證保留容器中的相對順序。?
stable_sort?:類似與?sort?,不過保留相等元素之間的順序關系。?
swap?:交換存儲在兩個對象中的值。?
swap_range?:將在范圍內的元素與另外一個序列的元素值進行交換。?
transform?:將輸入的操作作用在范圍內的每個元素上,并產生一個新的序列。重載版本將操作作用在一對元素上,另外一個元素來自輸入的另外一個序列。結果輸出到指定的容器。?
unique?:清除序列中重復的元素,和?remove?類似,它也不能真正的刪除元素。重載版本使用了自定義的操作。?
unique_copy?:類似與?unique?,不過它把結果輸出到另外一個容器。?
upper_bound?:返回一個?iterator?,它指向在范圍內的有序序列中插入?value?而不破壞容器順序的最后一個位置,該位置標志了一個大于?value?的值。重載版本使用了輸入的比較操作。?
堆算法:?C++?標準庫提供的是?max-heap?。一共由以下?4?個泛型堆算法。?
make_heap?:把范圍內的元素生成一個堆。重載版本使用自定義的比較操作。?
pop_heap?:并不是真正的把最大元素從堆中彈出,而是重新排序堆。它把?first?和?last-1?交換,然后重新做成一個堆。可以使用容器的?back?來訪問被“彈出“的元素或者使用?pop_back?來真正的刪除。重載版本使用自定義的比較操作。?
push_heap?:假設?first?到?last-1?是一個有效的堆,要被加入堆的元素在位置?last-1?,重新生成堆。在指向該函數前,必須先把元素插入容器后。重載版本使用指定的比較。?
sort_heap?:對范圍內的序列重新排序,它假設該序列是個有序的堆。重載版本使用自定義的比較操作。
轉載于:https://www.cnblogs.com/Leo-Forest/archive/2012/08/24/2653622.html
總結
以上是生活随笔為你收集整理的STL算法学习[转]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: selenium 元素定位常用的方法
- 下一篇: 大姐,你是不是得了尿频?