【C++】:STL迭代器使用---[容器::iterator iter;]


參考文章:http://blog.csdn.net/qq_23100787/article/details/51388163

迭代器這種東西,就是為了使訪問簡單!!

容器::iterator iter;

for(iter= 容器.begin();iter!=容器.end();iter++){

cout<<*iter或者是 iter->first等等之類的                                    //迭代器就是這么個套路

}

然后就是set,set就是一個集合,僅此而已,而其他的,像是map比較有意思,提供了兩種數據結構的對應,而其他的我們不要簡單的認為是隊列和棧,我們要認為這是一種容器,能夠包含多種數據結構,用了這種思想,我們就會想的更明白。

 

指針與數組
指針與其它數據結構呢?比如說鏈表?存儲空間是非連續的。不能通過對指向這種數據結構的指針做累加來遍歷。能不能提供一個行為類似指針的類,來對非數組的數據結構進行遍歷呢?這樣我們就能夠以同樣的方式來遍歷所有數據結構(容器)。 迭代器(Iterator)是指針(pointer)的泛化,它允許程序員以相同的方式處理不同的數據結構(容器)。STL中有五種類型的迭代器,它們分別滿足一定的要求,不同的迭代器要求定義的操作不一樣。下面的圖表畫出了這幾種:

[箭頭表示左邊的迭代器一定滿足右邊迭代器需要的條件。]

要注意,上面這圖表並不是表明它們之間的繼承關系:而只是描述了迭代器的種類和接口。處於圖表下層的迭代器都是相對於處於圖表上層迭代器的擴張集。例如:forward迭代器不但擁有input和output迭代器的所有功能,還擁有更多的功能。比如某個算法需要一個雙向迭代器(Bidirctional Iterator),你可以把一個任意存取迭代器(Random Access Iterator)作為參數;但反之不行。

迭代器iterator 提供了一種一般化的方法對順序或關聯容器類型中的每個元素進行連續訪問。例如,假設iter為任意容器類型的一個iterator,則++iter 表示向前移動迭代器使其指向容器的下一個元素,而*iter 返回iterator 指向元素的值,每種容器類型都提供一個begin()和一個end()成員函數。
begin()返回一個iterator 它指向容器的第一個元素
end()返回一個iterator 它指向容器的末元素的下一個位置
通過迭代器,我們可以用相同的方式來訪問、遍歷容器。
不同容器提供自己的迭代器,所以不同迭代器具有不同的能力。
迭代器的作用:
  • 能夠讓迭代器與算法不干擾的相互發展,最后又能無間隙的粘合起來。
  • 重載了*,++,==,!=,=運算符。用以操作復雜的數據結構。
  • 容器提供迭代器,算法使用迭代器。
  • 各個迭代器的功能如下:

迭代器類別

說明

輸入

從容器中讀取元素。輸入迭代器只能一次讀入一個元素向前移動,輸入迭代器只支持一遍算法,同一個輸入迭代器不能兩遍遍歷一個序列

輸出

向容器中寫入元素。輸出迭代器只能一次一個元素向前移動。輸出迭代器只支持一遍算法,統一輸出迭代器不能兩次遍歷一個序列

正向

組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置

雙向

組合正向迭代器和逆向迭代器的功能,支持多遍算法

隨機訪問

組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向后跳過任意個元素

 

迭代器的操作:

迭代器

操作

說明

所有迭代器

p++

后置自增迭代器

++p

前置自增迭代器

輸入迭代器

*p

復引用迭代器,作為右值

p=p1

將一個迭代器賦給另一個迭代器

p==p1

比較迭代器的相等性

p!=p1

比較迭代器的不等性

輸出迭代器

*p

復引用迭代器,作為左值

p=p1

將一個迭代器賦給另一個迭代器

正向迭代器

提供輸入輸出迭代器的所有功能

雙向迭代器

--p

前置自減迭代器

p--

后置自減迭代器

隨機迭代器

p+=i

將迭代器遞增i位

p-=i

將迭代器遞減i位

p+i

在p位加i位后的迭代器

p-i

在p位減i位后的迭代器

p[i]

返回p位元素偏離i位的元素引用

p<p1

如果迭代器p的位置在p1前,返回true,否則返回false

p<=p1

p的位置在p1的前面或同一位置時返回true,否則返回false

p>p1

如果迭代器p的位置在p1后,返回true,否則返回false

p>=p1

p的位置在p1的后面或同一位置時返回true,否則返回false

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

只有順序容器和關聯容器支持迭代器遍歷,各容器支持的迭代器的類別如下:

容器

支持的迭代器類別

說明

vector

隨機訪問

一種隨機訪問的數組類型,提供了對數組元素進行快速隨機訪問以及在序列尾部進行快速的插入和刪除操作的功能。可以再需要的時候修改其自身的大小

deque

隨機訪問

一種隨機訪問的數組類型,提供了序列兩端快速進行插入和刪除操作的功能。可以再需要的時候修改其自身的大小

list

雙向

一種不支持隨機訪問的數組類型,插入和刪除所花費的時間是固定的,與位置無關。

set

雙向

一種隨機存取的容器,其關鍵字和數據元素是同一個值。所有元素都必須具有惟一值。

multiset

雙向

一種隨機存取的容器,其關鍵字和數據元素是同一個值。可以包含重復的元素。

map

雙向

一種包含成對數值的容器,一個值是實際數據值,另一個是用來尋找數據的關鍵字。一個特定的關鍵字只能與一個元素關聯。

multimap

雙向

一種包含成對數值的容器,一個值是實際數據值,另一個是用來尋找數據的關鍵字。一個關鍵字可以與多個數據元素關聯。

stack

不支持

適配器容器類型,用vector,deque或list對象創建了一個先進后出容器

queue

不支持

適配器容器類型,用deque或list對象創建了一個先進先出容器

priority_queue

不支持

適配器容器類型,用vector或deque對象創建了一個排序隊列

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM