




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、這幾天在做圖像處理方面的研究,其中有一部分是關于圖像分割方面的,圖像目標在分割出來之后要做進一步的處理,因此有必要將目標圖像的信息保存在一個變量里面,一開始想到的是數組,但是馬上就發現使用數組的缺點:數組長度固定,動態分配內存很容易導致錯誤發生。最重要的一點是我要保存目標圖像的每一點的坐標值,使用數組就有點無能為力了。因此到百度、Google大神上面找思路,終于被我發現在c+的標準庫里面還有這么一個模板類:list,下面就是對找到的資料的匯總和加工。vc6自帶的msdn幫助文檔的解釋以下是引自msdn幫助文檔(中文是我自己翻譯的,錯誤之處請包涵。): The template class de
2、scribes an object that controls a varying-length sequence of elements of type T. The sequence is stored as a bidirectional linked list of elements, each containing a member of type T. 本模板類描述了一個對象,這個對象是類型為T的可變長度的序列元素。這個序列采用雙向鏈表的方式存儲每一個元素,其中每一個元素的數據流行都是T。 The object allocates and frees storage for the
3、 sequence it controls through a protected object named allocator, of class A. Such an allocator object must have the same external interface as an object of template class allocator. Note that allocatoris not copied when the object is assigned. 對序列對象的分配和釋放操作通過一個受保護的對象allocator進行。這樣一個allocator對象必須有相同
4、的外部接口作為一個模板類分配器的對象。注意:當對象被分配之后allocator不能被復制。 List reallocation occurs when a member function must insert or erase elements of the controlled sequence. In all such cases, only iterators or references that point at erased portions of the controlled sequence become invalid. 當一個成員要進行insert或者erase操作時,列表
5、的重新分配操作發生。在這種情況下,只有迭代器或者引用所指向的要刪除的對象的指針變為無效。msdn幫助文檔自帶的例子下面為msdn幫助文檔中自帶的一個例子,該例展示了如何使用迭代器讀取列表中的元素和進行插入操作。#include #include using namespace std ;typedef list LISTINT;void main() int rgTest1 = 5,6,7; int rgTest2 = 10,11,12; LISTINT listInt; LISTINT listAnother; LISTINT:iterator i; / Insert one at a ti
6、me listInt.insert (listInt.begin(), 2); listInt.insert (listInt.begin(), 1); listInt.insert (listInt.end(), 3); / 1 2 3 for (i = listInt.begin(); i != listInt.end(); +i) cout *i ; cout endl; / Insert 3 fours listInt.insert (listInt.end(), 3, 4); / 1 2 3 4 4 4 for (i = listInt.begin(); i != listInt.e
7、nd(); +i) cout *i ; cout endl; / Insert an array in there listInt.insert (listInt.end(), rgTest1, rgTest1 + 3); / 1 2 3 4 4 4 5 6 7 for (i = listInt.begin(); i != listInt.end(); +i) cout *i ; cout endl; / Insert another LISTINT listAnother.insert (listAnother.begin(), rgTest2, rgTest2+3); listInt.in
8、sert (listInt.end(), listAnother.begin(), listAnother.end(); / 1 2 3 4 4 4 5 6 7 10 11 12 for (i = listInt.begin(); i != listInt.end(); +i) cout *i ; cout endl;Program Output is:1 2 31 2 3 4 4 41 2 3 4 4 4 5 6 71 2 3 4 4 4 5 6 7 10 11 12list:list模板類的主要函數介紹assign() /給list賦值back() /返回最后一個元素begin() /返回
9、指向第一個元素的迭代器clear() /刪除所有元素empty() /如果list是空的則返回trueend() /返回末尾的迭代器erase() /刪除一個元素front() /返回第一個元素get_allocator() /返回list的配置器insert() /插入一個元素到list中max_size() /返回list能容納的最大元素數量merge() /合并兩個listpop_back() /刪除最后一個元素pop_front() /刪除第一個元素push_back() /在list的末尾添加一個元素push_front() /在list的頭部添加一個元素rbegin() /返回指向
10、第一個元素的逆向迭代器remove_if() /按指定條件刪除元素remove() /從list刪除元素rend() /指向list末尾的逆向迭代器resize() /改變list的大小reverse() /把list的元素倒轉size() /返回list中的元素個數sort() /給list排序splice() /合并兩個listswap() /交換兩個listunique() /刪除list中重復的元素常用的操作主要是有插入操作、刪除操作。list為實現頭尾高效的插入和刪除操作而提供了大多數的支持函數,而對于隨機訪問函數,則只能從頭部或者尾部進行遍歷操作。關于remove和erase函數上
11、面的介紹中關于插入等等操作都有幫助的例子,但是對于刪除函數,這個需要有一些注意的地方。下面請看例子:#include #include #include #include using namespace std;/創建一個list容器的實例LISTINTtypedef list TESTINT;void main() /使用TESTINT創建一個list類型的對象 TESTINT test; /使用TESTINT創建一個迭代器對象 TESTINT:iterator i; /從前面向listOne容器中添加數據 test.push_front (2); test.push_front (1);
12、/從后面向listOne容器中添加數據 test.push_back (3); test.push_back (4); /顯示刪除前的數據 coutbefore deleteendl; for (i = test.begin(); i != test.end(); +i)cout *i ; coutendl; /從列表中刪除一個元素 i = test.begin(); while(i != test.end() int tmp = *i; if(tmp = 2)test.erase(i+);/在這里要是指針前進1個,否則迭代器失效 elsei+; /顯示刪除后的數據 coutafter del
13、eteendl; for (i = test.begin(); i != test.end(); +i) cout *i ; coutendl;總結 在使用list的時候不能使用隨機訪問的方式,只能按照迭代的方式進行訪問,這樣的話在進行刪除操作的時候就可能會出現某一次刪除操作之后指針沒有指向下一個有效的元素而導致迭代器失效。因此,在進行刪除操作時候最好使用while的方式,使用for循環如果控制不好,可能會導致迭代器失效。 使用模版類可以極大的提高編程的效率,想想之前為了實現每個目標區域像素點的存取操作而使用這個方法都沒有很好的解決問題,真后悔沒有足夠的知識積累,在此記錄下來,共勉之。附件下面
14、的資料是在學習list模版類中找到的,以下內容均來自互聯網。C+ Lists(鏈表)Lists將元素按順序儲存在鏈表中. 與 向量(vectors)相比, 它允許快速的插入和刪除,但是隨機訪問卻比較慢.assign() 給list賦值back() 返回最后一個元素begin() 返回指向第一個元素的迭代器clear() 刪除所有元素empty() 如果list是空的則返回trueend() 返回末尾的迭代器erase() 刪除一個元素front() 返回第一個元素get_allocator() 返回list的配置器insert() 插入一個元素到list中max_size() 返回list能容
15、納的最大元素數量merge() 合并兩個listpop_back() 刪除最后一個元素pop_front() 刪除第一個元素push_back() 在list的末尾添加一個元素push_front() 在list的頭部添加一個元素rbegin() 返回指向第一個元素的逆向迭代器remove() 從list刪除元素remove_if() 按指定條件刪除元素rend() 指向list末尾的逆向迭代器resize() 改變list的大小reverse() 把list的元素倒轉size() 返回list中的元素個數sort() 給list排序splice() 合并兩個listswap() 交換兩個li
16、stunique() 刪除list中重復的元素附List用法實例:#include #include #include #include using namespace std;/創建一個list容器的實例LISTINTtypedef list LISTINT;/創建一個list容器的實例LISTCHARtypedef list LISTCHAR;void main(void) /- /用list容器處理整型數據 /- /用LISTINT創建一個名為listOne的list對象 LISTINT listOne; /聲明i為迭代器 LISTINT:iterator i; /從前面向listOne
17、容器中添加數據 listOne.push_front (2); listOne.push_front (1); /從后面向listOne容器中添加數據 listOne.push_back (3); listOne.push_back (4); /從前向后顯示listOne中的數據 coutlistOne.begin()- listOne.end():endl; for (i = listOne.begin(); i != listOne.end(); +i) cout *i ; cout endl; /從后向后顯示listOne中的數據LISTINT:reverse_iterator ir;
18、coutlistOne.rbegin()-listOne.rend():endl; for (ir =listOne.rbegin(); ir!=listOne.rend();ir+) cout *ir ; cout endl; /使用STL的accumulate(累加)算法 int result = accumulate(listOne.begin(), listOne.end(),0); coutSum=resultendl; cout-endl; /- /用list容器處理字符型數據 /- /用LISTCHAR創建一個名為listOne的list對象 LISTCHAR listTwo;
19、/聲明i為迭代器 LISTCHAR:iterator j; /從前面向listTwo容器中添加數據 listTwo.push_front (A); listTwo.push_front (B); /從后面向listTwo容器中添加數據 listTwo.push_back (x); listTwo.push_back (y); /從前向后顯示listTwo中的數據 coutlistTwo.begin()-listTwo.end():endl; for (j = listTwo.begin(); j != listTwo.end(); +j) cout char(*j) ; cout endl;
20、/使用STL的max_element算法求listTwo中的最大元素并顯示 j=max_element(listTwo.begin(),listTwo.end(); cout The maximum element in listTwo is: char(*j)endl;#include #include using namespace std;typedef list INTLIST;/從前向后顯示list隊列的全部元素void put_list(INTLIST list, char *name) INTLIST:iterator plist; cout The contents of na
21、me : ; for(plist = list.begin(); plist != list.end(); plist+) cout *plist ; coutendl;/測試list容器的功能void main(void)/list1對象初始為空 INTLIST list1; /list2對象最初有10個值為6的元素 INTLIST list2(10,6); /list3對象最初有3個值為6的元素 INTLIST list3(list2.begin(),-list2.end(); /聲明一個名為i的雙向迭代器 INTLIST:iterator i; /從前向后顯示各list對象的元素 put
22、_list(list1,list1); put_list(list2,list2); put_list(list3,list3);/從list1序列后面添加兩個元素list1.push_back(2);list1.push_back(4);coutlist1.push_back(2) and list1.push_back(4):endl; put_list(list1,list1);/從list1序列前面添加兩個元素list1.push_front(5);list1.push_front(7);coutlist1.push_front(5) and list1.push_front(7):e
23、ndl; put_list(list1,list1);/在list1序列中間插入數據list1.insert(+list1.begin(),3,9);coutlist1.insert(list1.begin()+1,3,9):endl; put_list(list1,list1);/測試引用類函數coutlist1.front()=list1.front()endl;coutlist1.back()=list1.back()endl;/從list1序列的前后各移去一個元素list1.pop_front();list1.pop_back();coutlist1.pop_front() and l
24、ist1.pop_back():endl; put_list(list1,list1);/清除list1中的第2個元素list1.erase(+list1.begin();coutlist1.erase(+list1.begin():endl; put_list(list1,list1);/對list2賦值并顯示list2.assign(8,1);coutlist2.assign(8,1):endl; put_list(list2,list2);/顯示序列的狀態信息coutlist1.max_size(): list1.max_size()endl;coutlist1.size(): list
25、1.size()endl;coutlist1.empty(): list1.empty()endl;/list序列容器的運算 put_list(list1,list1); put_list(list3,list3);coutlist3: list3)endl;coutlist1list3: (list1list3)endl;/對list1容器排序list1.sort(); put_list(list1,list1);/結合處理list1.splice(+list1.begin(), list3); put_list(list1,list1); put_list(list3,list3);補充:
26、STL標準函數find進行vector 、list鏈表查找#include #include #include class examplepublic:example(int val)i = val;bool operator=(example const & rhs)return (i = rhs.i) ? true : false;private:int i;using namespace std;int main(void)vector ve;ve.push_back(1);vector:iterator it;example elem(1);it = find(ve.begin(),
27、ve.end(), elem);coutboolalpha(*it = elem);C+中的vector使用范例一、概述vector是C+標準模板庫中的部分內容,它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。vector是一個容器,它能夠存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的動態數組,可以動態改變大小。例如:/ c語言風格int myHouse100 ;/ 采用vectorvector vecMyHouse(100);當如上定義后,vecMyHouse就可以存放100個int型的數據了。1. 它可以像普通數組一樣訪問eg: vecMyHouse50
28、= 1024;2. 你可以順序地向容器中填充數據eg:int i =0 ;for( ;i 25; i+ )vecMyHouse.push_back(1);3. 它還可以動態地改變它的大小,通過下面這條語句實現/ 將容器的大小改為400,這樣容器中就可以容納400個int型數據了eg:vecMyHouse.resize(400);4. 你也可以在容器中裝入自定義的數據類型eg:/ 自定義一個classclass Cmyclass;/ 定義一個存放class的容器vector vecMyHouse;5. 你可以在定義容器時為它賦初值/ 定義一個容納100個int型數據的容器,初值賦為0vector
29、 vecMyHouse(100,0);6. 你可以把一個容器的對象賦值給另外一個容器eg:/ 定義一個容納100個int型數據的容器,初值賦為0vector vecMyHouse(100,0);/ 定義一個新的容器,內容與上述容器一樣vector myVec ;myVec = vecMyHouse;二、 以上是vector容器的簡單介紹,下面將詳細介紹它的其他功能:1. 為了使用vector,必須在你的頭文件中包含下面的代碼:#include 2. vector屬于std命名域的,因此需要通過命名限定,可以在文件開頭加上using std:vector;或者using namespace st
30、d;或者直接在使用vector的代碼前加前綴eg:std:vector myHouse;3. vector提供如下函數或操作:下面列舉了部分常用的功能/ 定義一個vectorstd:vector c;/ 可以使用的功能c.clear() 移除容器中所有數據。c.empty() 判斷容器是否為空。c.erase(pos) 刪除pos位置的數據c.erase(beg,end) 刪除beg,end)區間的數據c.front() 傳回第一個數據。c.insert(pos,elem) 在pos位置插入一個elem拷貝c.pop_back() 刪除最后一個數據。c.push_back(elem) 在尾部加
31、入一個數據。c.resize(num) 重新設置該容器的大小c.size() 回容器中實際數據的個數。c.begin() 返回指向容器第一個元素的迭代器c.end() 返回指向容器最后一個元素的迭代器三、下面描述一下什么是迭代器迭代器相當于指針,例如:/ 對于變量而言,使用指針指向對應的變量/ 以后就可以使用 * 加指針來操作該變量了int a = 10;int *p;p = &a;/ 使用指針操作該變量eg: *p = 11; / 操作后a變為 11/ 對于容器,使用迭代器操作容器中對應位置的值/ 當迭代器指向了容器中的某位置,則可以使用 * 加迭代器操作該位置了/ 定義一個vectorst
32、d:vector myVec;/添加10個元素for(int j =0 ; j10 ; j+)myVec.push_back(j);/ 定義一個迭代器std:vector:iterator p;/ 指向容器的首個元素p = myVec.begin();/ 移動到下一個元素p +;/ 修改該元素賦值*p = 20 ; / 則myVec容器中的第二個值被修改為了20/ 循環掃描迭代器,改變所有的值p = myVec.begin();for( ; p!= myVec.end(); p+ )*p = 50;以上簡單講述了vector的用法,僅供入門之用,謝謝。-1.vector 的數據的存入和輸出:#
33、include#include#include using namespace std;void main()int i = 0;vector v;for( i = 0; i 10; i+ )v.push_back( i );/把元素一個一個存入到vector中/對存入的數據清空for( i = 0; i v.size(); i+ )/v.size() 表示vector存入元素的個數cout v i ; /把每個元素顯示出來cout endl;/注:你也可以用v.begin()和v.end() 來得到vector開始的和結束的元素地址的指針位置。你也可以這樣做:vector:iterator iter;for( iter = v.begin(); iter != v.end(); iter+ )cout *iter endl;2. 對于二維vector的定義。1)定
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年農村一二三產業融合發展的農村土地制度改革與創新報告
- 文化餐飲創新趨勢2025年主題餐廳營銷策略創新研究報告
- 藝術市場數字化交易平臺在藝術品交易中的法律風險識別與應對報告2025
- 快消品企業2025年包裝設計綠色包裝材料應用案例分析報告001
- 2025年可穿戴醫療設備在慢性呼吸系統疾病監測市場的需求與技術創新趨勢
- 城市出行變革:2025年自動駕駛汽車商業化案例分析報告
- 大潤發超市收貨管理制度
- 化妝品公司崗位管理制度
- 團干選拔培訓與管理制度
- 地震綜合觀測站管理制度
- 中級工電氣設備安裝工題庫
- 2023年重慶市開州區事業單位面向萬州、達州、云陽遴選15人考試備考試題及答案解析
- 財務部崗位廉潔風險點及防范措施匯總表
- 托物言志文章講評評改
- 古代漢語Ⅰ學習通課后章節答案期末考試題庫2023年
- 1919課件酒店硬件管理
- 2022北京海淀初二(下)期末英語試題含答案
- 西方經濟學吉林大學期末考試題庫答案 2023春
- 2023年北京定額及計算規則
- 廣樂高速公路混凝土拌和站施工標準化指南剖析
- 珠三角商圈網絡規劃課件
評論
0/150
提交評論