下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、) 語言學(xué)習(xí)之 9:2的組成STL 有三大部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器適配器(container adaptor),函數(shù)對象(functor),除此之外還有 STL其他標(biāo)準(zhǔn)組件。通俗的講:容器:裝東西的東西,裝水的,裝咸水的大海,裝人的教室STL 里的容器是可容納一些數(shù)據(jù)的模板類。算法:就是往里倒水,往大海里排污,從教室里攆人STL 里的算法,就是處理容器里面數(shù)據(jù)的方法、操作。迭代器:往里倒水的水壺,排污的管道,攆人的那個物業(yè)管理STL里的迭代器:遍歷容器中數(shù)據(jù)的對象。對于容器中的數(shù)據(jù)進行處理時,迭代器能從一個成員移向另一個成
2、員。他能按預(yù)先定義的順序在某些容器中的成員間移動。對普通的一維數(shù)組、向量、雙端隊列和列表來說,迭代器是一種指針。下面讓來看看是怎么說的:容器(container):容器是數(shù)據(jù)在內(nèi)存中組織的方法,例如,數(shù)組、堆棧、隊列、鏈表或二叉樹(不過這些都不是 STL 標(biāo)準(zhǔn)容器)。STL 中的容器是一種T(Template)類型值的有限集合的數(shù)據(jù)結(jié)構(gòu),容器的實現(xiàn)一般是類。這些值可以是對象本身,如果數(shù)據(jù)類型 T 代表的是 Class 的話。算法(algorithm):算法是應(yīng)用在容器上以各種方法處理其內(nèi)容的行為或功能。例對容器內(nèi)容排序、檢索和合并的算法。在 STL 中,算法是由模板函數(shù)表現(xiàn)的。這些函數(shù)不是容器
3、類的成員函數(shù)。相反,它們是獨立的函數(shù)。令人吃驚的特點之一就是其算法如此通用。不僅可以將其用于 STL 容器,而且可以用于普通的 C數(shù)組或任何其他應(yīng)用程序指定的容器。迭代器(iterator):一旦選定一種容器類型和數(shù)據(jù)行為(算法),那么剩下唯一要他做的就是用迭代器使其相互作用??梢园堰_代器看作一個指向容器中元素的普通指針??梢匀邕f增一個指針那樣遞增迭代器,使其依次指向容器中每一個后繼的元素。迭代器是 STL 的一個關(guān)鍵部分,因為它將算法和容器連在一起。下面我將依次介紹 STL 的這三個主要組件。1.容器STL 中的容器有隊列容器和關(guān)聯(lián)容器,容器適配器(congtainer adapters:
4、stack,queue,priority queue),位集(bit_set),串包(string_package)等等。在本文中,我將介紹 list,vector,deque 等隊列容器,和 set 和multisets,map 和 multimaps 等關(guān)聯(lián)容器,一共 7 種基本容器類。隊列容器(順序容器):隊列容器按照線性排列來T 類型值的集合,隊列的每個成員都有自己的特有的位置。順序容器有向量類型、雙端隊列類型、列表類型三種。u基本容器向量向量(vector 容器類):include ,vector 是一種動態(tài)數(shù)組,是基本數(shù)組的類模板。其定義了很多基本操作。既然這是一個類,那么它就會有
5、自己的構(gòu)造函數(shù)。vector類中定義了 4 中種構(gòu)造函數(shù):默認構(gòu)造函數(shù),構(gòu)造一個初始長度為 0 的空向量,如:vector v1;帶有單個整形參數(shù)的構(gòu)造函數(shù),此參數(shù)描述了向量的初始大小。這個構(gòu)造函數(shù)還有一個可選的參數(shù),這是一個類型為 T 的實例,描述了各個向量種各成員的初始值;如:vector v2(n,0);如果預(yù)先定義了:n,他的成員值都被初vector v3(v2);,如:帶兩個常量參數(shù)的構(gòu)造函數(shù),產(chǎn)生初始值為一個區(qū)間的向量。區(qū)間由一個半開區(qū)間,last)來指定。如:vector v4(,last)下面一個例子用的是第四種構(gòu)造方法,其它的方法讀者可以自己試試。/程序:初始化演示#incl
6、ude #include #include using namespatd; 6.7.ar10 = 12, 45, 234, 64, 12, 35, 63, 23, 12, 55 ;8. char* str = o World;為了幫助理解向量的概念,這里寫了一個小例子,其中用到了 vector 的成員函數(shù):begin(),end(),push_back(),assign(),front(),back(),erase(),empty(),at(),size()。#include #include using namespatd; 4.typedef vectorVECTOR;/自定義類型VEC
7、TOR/測試vector 容器的功能7.8.main() 9. /vec1 對象初始為空VECTOR vec1;/vec2 對象最初有 10 個值為 6 的元素VECTOR vec2(10,6);/vec3 對象最初有 3 個值為 6 的元素,拷貝構(gòu)造9.10.main()11. vector vec1(ar, ar+10);/=ar,last=ar+10,不包括ar+10vector vec2(str,str+strlen(str); /=str,last= str+strlen( str),coutvec1:endl;/打印vec1 和vec2,const_iterator 是迭代器,后面
8、會講到/當(dāng)然,也可以用for (i=0; ivec1.size(); i+)cout veci;輸出/size()是vector 的一個成員函數(shù)for(vector:const_iterator p=vec1.begin();p!=vec1.end(); +p)cout*p;20.cout/nvec2:endl;for(vector:const_iterator p1=vec2.begin();p1!=vec2.end(); +p1)cout*p1;23.cout/n;24.return 0;25. 15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30
9、.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.VECTOR vec3(vec2.begin(),vec2.begin()+3);/一個名為i 的雙向迭代器VECTOR:iterator i;/從前向后顯示vec1 中的數(shù)據(jù) coutvec1.begin()-vec1.end():endl; for (i =vec1.begin(); i !=vec1.end(); +i)cout *i ; cout endl;/從前向后顯示vec2 中的數(shù)據(jù) coutvec2.begin
10、()-vec2.end():endl; for (i =vec2.begin(); i !=vec2.end(); +i)cout *i ; cout endl;/從前向后顯示vec3 中的數(shù)據(jù) coutvec3.begin()-vec3.end():endl; for (i =vec3.begin(); i !=vec3.end(); +i)cout *i ;cout endl;/測試添加和成員函數(shù),vector 不支持從前vec1.push_back(2);/從后面添加一個成員 vec1.push_back(4);vec1.insert(vec1.begin()+1,5);/在vec1 第
11、一個的位置上成員 5/從vec1 第一的位置開始vec3 的所有成員vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end();coutaftush() and insert() now the vec1 is: endl;for (i =vec1.begin(); i !=vec1.end(); +i)cout *i ; cout endl;/測試賦值成員函數(shù)/ 重新給vec2 賦值,8 個成員的初始值都為 1vec2.assign(8,1);coutvec2.assign(8,1): endl;for (i =vec2.begin(); i !=v
12、ec2.end(); +i) cout *i ;cout endl;/測試類函數(shù)coutvec1.front()=vec1.front()endl;/vec1 第零個成員 coutvec1.back()=vec1.back()endl;/vec1 的最后一個成員 coutvec1.at(4)=vec1.at(4)endl;/vec1 的第五個成員 coutvec14=vec14endl;/測試移出和刪除vec1.pop_back();/將最后一個成員移出 vec1 vec1.erase(vec1.begin()+1,vec1.end()-2);/刪除成員 coutvec1.pop_back()
13、 and vec1.erase(): endl;for (i =vec1.begin(); i !=vec1.end(); +i)push_back()是將數(shù)據(jù)放入 vector(向量)或 deque(雙端隊列)的標(biāo)準(zhǔn)函數(shù)。 Insert()是一個與之類似的函數(shù),然而它在所有容器中都可以使用,但是用法更加復(fù)雜。end()實際上是取末尾加一,以便讓循環(huán)正確運行-它返回的指針指向最靠近數(shù)組界限的數(shù)據(jù)。在 Java 里面也有向量的概念。Java 中的向量是對象的集合。其中,各元素可以不必同類型,元素可以增加和刪除,不能直接加入原始數(shù)據(jù)類型。u雙端隊列(qeque 容器類):deque(讀音:deck
14、,意即:double queue,#include)容器類與 vector類似,支持隨機和快速刪除,它在容器中某一位置上的操作所花費的是線性時間。與 vector 不同的是,deque 還支持從開始端數(shù)據(jù):push_front()。此外 deque 也不支持與 vector 的 capacity()、reserve()類似的操作。#include #include using namespatd; 4.5. typedef dequeDEQUE;/有些人很討厭這種定義法,呵呵 6./從前向后顯示deque 隊列的全部元素void put_deque(DEQUE deque, char *nam
15、e) 9. DEQUE:iterator pdeque;/仍然使用迭代器輸出cout The contents of name : ;for(pdeque = deque.begin(); pdeque != deque.end(); pdeque+)cout *pdeque ;/注意有 *號哦,沒有*號的話會報錯coutendl;59.cout *i ;cout endl;/顯示序列的狀態(tài)信息coutvec1.size(): vec1.size()endl;/打印成員個數(shù)coutvec1.empty(): vec1.empty()endl;/清空64. 15. 16.17. /測試deqto
16、r 容器的功能18.19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.58.main()/deq1 對象初始為空DEQUE deq1;/deq2 對象最初有 10 個值為 6 的元素DEQUE deq2(10,6);/一個名為i 的雙向迭代器變量DEQUE:iterator i;/從前向后顯示deq1 中的數(shù)據(jù)put_deque(deq1
17、,deq1);/從前向后顯示deq2 中的數(shù)據(jù)put_deque(deq2,deq2);/從deq1 序列后面添加兩個元素 deq1.push_back(2); deq1.push_back(4);coutdeq1.push_back(2) and deq1.push_back(4):endl; put_deque(deq1,deq1);/從deq1 序列前面添加兩個元素 deq1.push_front(5); deq1.push_front(7);coutdeq1.push_front(5) and deq1.push_front(7):endl;put_deque(deq1,deq1);/
18、在deq1 序列中間數(shù)據(jù)deq1.insert(deq1.begin()+1,3,9);coutdeq1.insert(deq1.begin()+1,3,9):endl; put_deque(deq1,deq1);/測試類函數(shù)coutdeq1.at(4)=deq1.at(4)endl;coutdeq14=deq14endl; deq1.at(1)=10;deq12=12;coutdeq1.at(1)=10 and deq12=12 :endl; put_deque(deq1,deq1);/從deq1 序列的前后各移去一個元素 deq1.pop_front(); deq1.pop_back();
19、coutdeq1.pop_front() and deq1.pop_back():endl; put_deque(deq1,deq1);/清除deq1 中的第 2 個元素deq1.erase(deq1.begin()+1); coutdeq1.erase(deq1.begin()+1):endl;上面演示了 deque 如何進行刪除等操作,像 erase(),assign()是大多數(shù)容器都有的操作。關(guān)于 deque 的其他操作請參閱其他書籍。u表(List 容器類)List(#include)又叫鏈表,是一種雙線性列表,只能順序(從前向后或者從后向前),圖 2 是 list 的數(shù)據(jù)組織形式。與
20、前面兩種容器類有一個明顯的區(qū)別就是:它不支持隨機。要表中某個下標(biāo)處的項需要從表頭或表尾處(接近該下標(biāo)的一端)開始循環(huán)。而且缺少下標(biāo)符:operator。圖 2同時,list 仍然包涵了erase(),begin(),end(),insert(),push_back(),push_front()這些基本函數(shù),下面來演示一下 list 的其他函數(shù)功能。merge():合并兩個排序列表;splice():拼接兩個列表;sort():列表的排序。#include #include #include using namespatd; 5.put_deque(deq1,deq1);/對deq2 賦值并顯示
21、deq2.assign(8,1);coutdeq2.assign(8,1):endl;put_deque(deq2,deq2);64. 上面并沒有演示 splice()函數(shù)的用法,這是一個拗口的函數(shù)。用起來有點麻煩。圖 3 所示是 splice 函數(shù)的功能。將一個列表類定義了 splice()函數(shù)的 3 個版本:到另一個列表當(dāng)中。list 容器splice(ition,list_value);splice(ition,list_value,ptr);splice(ition,list_value,last);list_value 是一個已存在的列表,它將入到源列表中,ition 是一個迭代參數(shù)
22、,他當(dāng)前指向的是要進行拼接的列表中的特定位置。6. void PrIt(list n) 7. for(list:iterator iter=n.begin(); iter!=n.end(); +iter)cout*iter ;/用迭代器進行輸出循環(huán)10. 11.12.main()13. list listn1,listn2;/給listn1,listn2 初始化listn1.push_back(123);listn1.push_back(0);listn1.push_back(34);18.listn1.push_back(1123);/now listn1:123,0,34,1123list
23、n2.push_back(100);listn2.push_back(12);/now listn2:12,100listn1.sort();listn2.sort();/給listn1 和listn2 排序23./now listn1:0,34,123,1123listn2:12,100PrIt(listn1);coutendl;PrIt(listn2);listn1.merge(listn2);/合并兩個排序列表后,listn1:0,12,34,100,123, 1123coutendl;PrIt(listn1);30. 圖 3listn1:123,0,34,1123listn2:12,1
24、00執(zhí)行 listn1.splice(find(listn1.begin(),listn1.end(),0),listn2);之后,listn1 將變?yōu)椋?23,12,100,34,1123。即把 listn2到 listn1 的 0 這個元前。其中,find()函數(shù)找到 0 這個元素在 listn1 中的位置。值得注意的是,在執(zhí)行 splice 之后,list_value 將不復(fù)存在了。這個例子中是 listn2將不再存在。第二個版本當(dāng)中的 ptr 是一個迭代器參數(shù),執(zhí)行的結(jié)果是把 ptr 所指向的值直接到ition 當(dāng)前指向的位置之前.這將只向源列表中一個元素。第三個版本的和 last 也
25、是迭代器參數(shù),并不等于list_value.begin(),list_value.end()。指的是要的列的第一個元素,last 指的是要的列的最后一個元素。如果 listn1:123,0,34,1123 listn2:12,43,87,100執(zhí)行完以下函數(shù)之后listn1.splice(find(listn1.begin(),listn1.end(),0),+listn2.begin(),-listn2.end();listn1:123,43,87,0,34,1123listn2:12,100以上學(xué)習(xí)了 vector,deque,list 三種基本順序容器,其他的順序容器還有:slist,b
26、it_vector 等等。u集和多集(set 和 multiset 容器類):一個集合(#include)是一個容器,它其中所包含的元素的值是唯一的。這在收集一個數(shù)據(jù)的具體值的時候是有用的。集合中的元素按一定的順序排列,并被作為集合中的實例。如果你需要一個鍵/值對(pair)來數(shù)據(jù),map(也是一個關(guān)聯(lián)容器,后面將馬上要講到)是一個更好的選擇。一個集合通過一個鏈表來組織,在操作和刪除操作上比向量(vector)快,但查找或添加末尾的元素時會有些慢。在集中,所有的成員都是排列好的。如果先后往一個集中:12,2,3,123,5,65則輸出該集時為:2,3,5,12,65,123集和多集的區(qū)別是:s
27、et 支持唯一鍵值,set 中的值都是特定的,而且只出現(xiàn)一次;而 multiset 中可以出現(xiàn)副本鍵,同一值可以出現(xiàn)多次。Set 和 multiset 的模板參數(shù):template第一個參數(shù) key 是所的鍵的類型,第二個參數(shù)是為排序值而定義的比較函數(shù)的類型,第三個參數(shù)是被實現(xiàn)的分配符的類型。在有些編譯器的具體實現(xiàn)中,第三個參數(shù)可以省略。第二個參數(shù)使用了合適形式的迭代器為鍵定義了特定的關(guān)系操作符,并用來在容器中遍歷值時建立順序。集的迭代器是雙向,同時也是常量的,所以迭代器在使用的時候不能修改元素的值。Set 定義了三個構(gòu)造函數(shù):默認構(gòu)造函數(shù):explicit set(constpare();如
28、:set,less set1;less是一個標(biāo)準(zhǔn)類,用于形成降序排列函數(shù)對象。升序排列是用greater。通過指定某一預(yù)先定義的區(qū)間來初始化 set 對象的構(gòu)造函數(shù):template set(InputIterator, InputIterator,/ constpare();如:set,less set2(vector1.begin(),vector1.end();構(gòu)造函數(shù):set(const set);如:set,less set3(set2);下面來看一個簡單的集和多集的例程:u和多重(map 和 multimap)和多重(#include)基于某一類型 Key 的鍵集的存在,提供對 T
29、 類型的數(shù)據(jù)進行快速和高效的檢索。對 map 而言,鍵只是指在容器中的某一成員。Map 不支持副本鍵,multimap 支持副本鍵。Map 和 multimap 對象包涵了鍵和各個鍵有關(guān)的值,鍵和值的數(shù)據(jù)類型是不相同的,這與 set 不同。set 中的 key#include #include using namespatd; 4.5.main() 6. 7.set set1;8.for(i=0; i10; +i)set1.insert(i);for(set:iterator p=set1.begin();p!=set1.end();+p)11.cout*p;if(set1.insert(3)
30、.second)/把 3到set1 中/成功則set1.insert(3).second 返回 1,否則返回 0/此例中,集中已經(jīng)有 3 這個元素了,所以將失敗coutset insert sucs;elsecoutset insert failed;18.a = 4, 1, 1, 1, 1, 1, 0, 5, 1, 0;multiset A;A.insert(set1.begin(),set1.end();A.insert(a,a+10);coutendl;for(multiset:iterator p=A.begin();p!=A.end();+p)24.cout*p ;25.return
31、 0;26. 和 value 是 Key 類型的,而 map 中的 key 和 value 是一個 pair 結(jié)構(gòu)中的兩個分量。Map 支持下表運算符 operator,用普通數(shù)組的方式map,不過下標(biāo)為 map 的鍵。在 multimap 中一個鍵可以對應(yīng)多個不同的值。下面的例程說明了 map 中鍵與值的關(guān)系。#include #include using namespatd;main()mapchar,less map1;mapchar,less :iteratormapIter;/char是鍵的類型,是值的類型/下面是初始化,與數(shù)組類似/也可以用map1.insert(mapchar,l
32、ess :value_type(c,3);map1c=3;map1d=4;map1a=1;map1b=2;for(mapIter=map1.begin();mapIter!=map1.end();+mapIter)cout (*mapIter).: (*mapIter).second;/對應(yīng)定義中的 char 鍵,second 對應(yīng)定義中的值/檢索對應(yīng)于 d 鍵的值是這樣做的:mapchar,less :const_iterator ptr;ptr=map1.find(d);cout/n (*ptr).(*ptr).second;鍵對應(yīng)于值:return 0;從以上例程中,可以看到 map 對
33、象的行為和一般數(shù)組的行為類似。Map允許兩個或多個值使用比較操作符。下面再看看 multimap:#include #include #include using namespatd; 5.6.main() 7. multimapstring,string,less mulmap;multimapstring,string,less :iterator p;/初始化多重mulmap:typedef multimapstring,string,less :value_type vt;typedef string s;mulmap.insert(vt(s(Tom ),s(is a student)
34、;mulmap.insert(vt(s(Tom ),s(is a boy);mulmap.insert(vt(s(Tom ),s(is a bad boy of blue!);mulmap.insert(vt(s(Jerry ),s(is a student);mulmap.insert(vt(s(Jerry ),s(is a beatutiful girl);mulmap.insert(vt(s(DJ ),s(is a student);/輸出初始化以后的多重mulmap:for(p=mulmap.begin();p!=mulmnd();+p)cout(*p).(*p).secondendl
35、;/檢索并輸出Jerry 鍵所對應(yīng)的所有的值coutfind Jerry :endl;在 map 中是不允許一個鍵對應(yīng)多個值的,在 multimap 中,不支持 operator,也就是說不支持 map 中允許的下標(biāo)操作。2.算法(algorithm):#inlcude STL 中算法的大部分都某些特定容器類的成員函數(shù),他們是泛型的,每個算法都有處理大量不同容器類中數(shù)據(jù)的使用。值得注意的是,STL 中的算法大多有多種版本,用戶可以依照具體的情況選擇合適版本。中在 STL 的泛型算法中有4 類基本的算法:變序型隊列算法:可以改變?nèi)萜鲀?nèi)的數(shù)據(jù);非變序型隊列算法:處理容器內(nèi)的數(shù)據(jù)而不改變他們;排序值
36、算法:包涵對容器中的值進行排序和合并的算法,還有二叉搜索算法、通用數(shù)值算法。(注:STL 的算法并不只是針對 STL 容器,對一般容器也是適用的。)變序型隊列算法:又叫可修改的序列算法。這類算法有(copy)算法、交換(swap)算法、替代(replace)算法、刪除(clear)算法,移動(remove)算法、翻轉(zhuǎn)(reverse)算法等等。這些算法可以改變?nèi)萜髦械臄?shù)據(jù)(數(shù)據(jù)值和值在容器中的位置)。下面介紹 2 個比較常用的算法 reverse()和 copy()。#include #include p=mulmap.find(s(Jerry );while(*p).=Jerry )26.2
37、7.cout(*p).(*p).secondendl; 28.+p;29.30.return 0;31. revese()的功能是將一個容器內(nèi)的數(shù)據(jù)順序翻轉(zhuǎn)過來,它的原型是:templatevoid reverse(Bidirectional, Bidirectional last);將和 last 之間的元素翻轉(zhuǎn)過來,上例中你也可以只將 arr 中的一部分進行翻轉(zhuǎn):reverse(arr+3,arr+6);這也是有效的和 last 需要指定一個操作區(qū)間。Copy()是要將一個容器內(nèi)的數(shù)據(jù)到另一個容器內(nèi),它的原型是:Template#include /下面用到了輸出迭代器ostream_ite
38、ratorusing namespatd; 6.7.main() 8. 9.arr6=1,12,3,2,1215,90;10.arr17;11.arr26=2,5,6,9,0,-56;copy(arr,(arr+6),arr1);/將數(shù)組 aar到arr1coutarr6 copy to arr17,now arr1: endl; 14.for(i=0;i7;i+)15.cout arr1i;reverse(arr,arr+6);/將排好序的 arr 翻轉(zhuǎn)cout/narr reversed ,now arr:endl;copy(arr,arr+6,ostream_iterator(cout,
39、 );/到輸出迭代器swap_ranges(arr,arr+6,arr2);/交換 arr 和arr2 序列cout/narr swd to arr2,now arr:endl;copy(arr,arr+6,ostream_iterator(cout, ); 22.cout/narr2:endl;copy(arr2,arr2+6,ostream_iterator(cout, );return 0;25. OutputIterator copy(InputIteratorOutputIterator result);, InputIteratorlast,它把,last1內(nèi)的隊列成員到區(qū)間res
40、ult,result+(last-)-1中。泛型交換算法:Swap()操作的是單值交換,它的原型是:templatevoid swap(T& a,T& b);swap_ranges()操作的是兩個相等大小區(qū)間中的值,它的原型是:templateForwardIterator2swap_ranges(ForwardIterator11,ForwardIterator1 last1, ForwardIterator12);交換區(qū)間1,last1-1和2,2+(last1-1)-1之間的值,并假設(shè)這兩個區(qū)間是不的。非變序型隊列算法,又叫不可修改的序列算法。這一類算法操作不影響其操作的容器的內(nèi)容,包括
41、搜索隊列成員算法,等價性檢查算法,計算隊列成員個數(shù)的算法。我將用下面的例子介紹其中的 find(),search(),count():#include #include #include using namespatd; 5.6.main() 7. 8.a10=12,31,5,2,23,121,0,89,34,66;9.vector v1(a,a+10);find()的原型是:templateInputIterator find(InputIteratorparable& value);, InputIterator last, const其功能是在序列,last-1中查找 value 值,如
42、果找到,就返回一個指向value 在序列中第一次出現(xiàn)的迭代,如果沒有找到,就返回一個指向 last 的迭代(last 并不屬于序列)。search()的原型是:vector:iterator result1,result2;/result1 和result2 是隨機迭代器result1=find(v1.begin(),v1.end(),2);/在v1 中找到 2,result1 指向v1 中的 2result2=find(v1.begin(),v1.end(),8);/在v1 中沒有找到 8,result2 指向的是v1.end()coutresult1-v1.begin()endl; /30
43、3 或 413,屏幕結(jié)果是 3coutresult2-v1.end()endl; 17.b9=5,2,23,54,5,5,5,2,2; 18.vector v2(a+2,a+8);vector v3(b,b+4);result1=search(v1.begin(),v1.end(),v2.begin(),v2.end();cout*result1endl;/在v1 中找到了序列v2,result1 指向 v2 在v1 中開始的位置result1=search(v1.begin(),v1.end(),v3.begin(),v3.end();cout*(result1-1)endl;/在v1 中沒
44、有找到序列v3,result 指向v1.end(),屏幕打印出 v1 的最后一個元素66vector v4(b,b+9);i=count(v4.begin(),v4.end(),5);j=count(v4.begin(),v4.end(),2);coutthere are i members in v4 equel to 5endl;coutthere are j members in v4 equel to 2endl;/計算 v4 中有多少個成員等于 5,2return 0;33. template ForwardIterator1 search(ForwardIterator1last1
45、,1,ForwardIterator1ForwardIterator22, ForwardIterator2 last2);其功能是在源序列1,last1-1查找目標(biāo)序列2,last2-1如果查找成功,就返回一個指向源序列中目標(biāo)序列出現(xiàn)的首位置的迭代。查找失敗則返回一個指向 last 的迭代。Count()的原型是:template iterator_traits:difference_type count(InputIterator,InputIterator last, constparable& value);其功能是在序列得成員的個數(shù)。,last-1中查找出等于 value 的成員,返
46、回等于 value排序算法(sort algorithm):這一類算法很多,功能強大同時也相對復(fù)雜一些。這些算法依賴的是關(guān)系運算。在這里我只介紹其中比較簡單的幾種排序算法:sort(),merge(),includes()#include #include using namespatd; 4.5.main() 6. 7.a10=12,0,5,3,6,8,9,34,32,18;8.b5=5,3,6,8,9;9.d15;10.sort(a,a+10);11.for(i=0;i10;i+)12.cout ai;13.sort(b,b+5);sort()的原型是:template void sort
47、(RandomAcsIterator, RandomAcsIterator last);功能是對,last-1區(qū)間內(nèi)的元素進行排序操作。與之類似的操作還有:partial_sort(), stable_sort(),partial_sort_copy()等等。merge()的原型是:template OutputIterator merge(InputIterator11, InputIterator1last1,InputIterator2result);2,InputIterator2 st2,OutputIterator將有序區(qū)間(last1 -1,last1-1和1) + (last2
48、 -2,last2-1合并到result, result2)-1區(qū)間內(nèi)。+Includes()的原型是:template bool includes(InputIterator11, InputIterator1 last1,InputIterator22, InputIterator2 last2);if(includes(a,a+10,b,b+5)cout/nsorted b members are included in a.endl;elsecoutsorted a dosnt contain sorted b!; 18.merge(a,a+10,b,b+5,d);19.for(j=0
49、;j15;j+)20.cout dj;21.return 0;22. 其功能是檢查有序區(qū)間間內(nèi),返回一個 bool 值。2,last2-1內(nèi)元素是否都在1,last1-1區(qū)通用數(shù)值算法(generalized numeric algorithms):這一類算法還不多,涉及到專業(yè)領(lǐng)域中有用的算術(shù)操作,獨立包涵于頭文件中。STL 中的算法大都有多種版本,常見的版本有以下 4 中:默認版本,假設(shè)給出了特定操作符;一般版本,使用了成員提供的操作符;版本,對原隊列的副本進行操作,常帶有_copy后綴;謂詞版本,只應(yīng)用于滿足給定謂詞的隊列成員,常帶有_if后綴;以上學(xué)習(xí)了 STL 容器和算法的概念,以及一
50、些簡單的 STL 容器和算法。在使用算法處理容器內(nèi)的數(shù)據(jù)時,需要從一個數(shù)據(jù)成員移向另一個數(shù)據(jù)成員,迭代器恰好實現(xiàn)了這能。下面來學(xué)習(xí) STL 迭代器。3.迭代器(itertor):#include迭代器實際上是一種泛化指針,如果一個迭代器指向了容器中的某一成員,那么迭代器將可以通過自增自減來遍歷容器中的所有成員。迭代器是聯(lián)系容器和算法的媒介,是算法操作容器的接口。在運用算法操作容器的時候,不覺中已經(jīng)使用了迭代器。STL 中定義了 6 種迭代器:常常在不知輸入迭代器,在容器的連續(xù)區(qū)間內(nèi)向前移動,可以容器內(nèi)任意值;輸出迭代器,把值寫進它所指向的隊列成員中;前向迭代器,隊列中的值,并可以向前移動到下一
51、位置(+p,p+);雙向迭代器,隊列中的值,并可以向前向后遍歷容器;隨機器;迭代器,vector:iterator,list:iterator 等都是這種迭代流迭代器,可以直接輸出、輸入流中的值;實際上,面的例子中,不停的在用迭代器。下面用幾個例子來幫助理解這些迭代器的用法。下面的例子用到了輸入輸出迭代器:這里用到了輸入迭代器 istream_iterator,輸出迭代器 ostream_iterator。程序完成了將一個文件輸出到屏幕的功能,先將文件讀入,然后通過輸入迭代器把文件內(nèi)容到類型為字符串的向量容器內(nèi),最后由輸出迭代器輸出。Inserter是一個輸入迭代器的一個函數(shù)(迭代器適配器),它的使用方法是:inserter (container ,);#include #include #include #include #include using namespatd; 7.8.main() 9. vector v1;ifstream file(Text1.txt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 吊車卸鋼材合同范例
- 奶茶股合同范例
- 定金購車合同范例
- 圍欄刷漆合同模板
- 開籃球館合同范例
- 快遞員勞工合同范例
- 公司授權(quán)個人借款合同范例
- 小區(qū)房出售合同模板
- 工程續(xù)保合同范例
- 快遞客棧轉(zhuǎn)讓合同范例
- 消防安全知識培訓(xùn)課件
- 16J914-1 公用建筑衛(wèi)生間
- 2024年廣東恒健投資控股有限公司招聘筆試參考題庫含答案解析
- 多重耐藥菌病例分析ppt課件
- 六十四卦圖文詳解
- 要事第一(課堂PPT)
- SDR特別提款權(quán)PPT課件
- 對排球大力跳發(fā)球失誤的技術(shù)原因分析
- 中藥飲片甲類
- 初中化學(xué)儀器與藥品編碼
- PRVC機械通氣PPT課件
評論
0/150
提交評論