摘要:算法部分主要由頭文件組成。數值算法對容器內容進行數值計算。在指定范圍內查找由輸入的另外一對標志的第二個序列的最后一次出現。重載函數使用自定義比較操作。刪除指定范圍內所有等于指定元素的元素。返回,指出序列中最小的元素。
STL算法部分主要由頭文件,
分類
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函數**
01.#include02.#include 03.#include 04.using namespace std; 05. 06. 07.int main( ) 08.{ 09. vector intv; 10. for(int i=0;i<10;i++) 11. intv.push_back(i); 12. 13. vector ::iterator inti; 14. inti=find(intv.begin(),intv.end(),50); 15. if(inti==intv.end()) 16. cout<<"沒有找到匹配的值"; 17. else 18. cout<<"找到了匹配的值"; 19. cout< 輸出:
沒有找到匹配的值
找到了匹配的值find if 函數
01.#include "stdafx.h" 02.#include03.#include 04.#include 05.using namespace std; 06.bool greater5(int i) 07.{ 08. return i>5; 09.} 10. 11. 12.int main( ) 13.{ 14. vector intv; 15. for(int i=0;i<10;i++) 16. intv.push_back(i); 17. 18. vector ::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.#include03.#include 04.#include
05.#include 06.using namespace std; 07. 08.int main(int argc, _TCHAR* argv[]) 09.{ 10. vector intv; 11. intv.push_back(2); 12. intv.push_back(5); 13. intv.push_back(3); 14. 15. list intl; 16. list ::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 80repalce函數
01.#include "stdafx.h" 02.#include03.#include 04.#include 05.using namespace std; 06.int main() 07.{ 08. vector intv; 09. vector ::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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64118.html
vector 特點: 1.可變長的動態數組 2.使用時包含頭文件 #include 3.支持隨機訪問迭代器 ? 根據下標隨機訪問某個元素時間為常數 ? 在尾部添加速度很快 ? 在中間插入慢 成員函數 初始化 [cpp] view plaincopy 01.vector(); 初始化成空 02.vector(int n); 初始...
摘要:更加實際的定義應該是一個集合是一個容器,它其中所包含的元素的值是唯一的。對而言,鍵只是指存儲在容器中的某一成員。成員函數構造函數中的元素都是模板類對象。元素按照成員變量從小到大排列,缺省情況下用定義關鍵字的小于關系。 分類:set, multiset, map, multimap 特點:內部元素有序排列,新元素插入的位置取決于它的值,查找速度快。 常用函數: find: 查找等于...
閱讀 1506·2021-11-17 09:33
閱讀 1272·2021-10-11 10:59
閱讀 2904·2021-09-30 09:48
閱讀 1914·2021-09-30 09:47
閱讀 3035·2019-08-30 15:55
閱讀 2347·2019-08-30 15:54
閱讀 1500·2019-08-29 15:25
閱讀 1657·2019-08-29 10:57