C++STL迭代器

自C++11起,咱們就可使用一個range-based for循環來處理全部的元素。這令人們意識到,咱們須要一個」可以迭代某序列(sequence)內全部元素」的對象,這個對象就是迭代器,你也能夠理解爲,經過迭代器這個對象,能夠表現出容器元素的位置。ios

迭代器的功能算法

1.指向容器中的元素,相似於指針。dom

2.做爲容器與算法的媒介,也能夠稱做粘合劑。函數

迭代器的頭文件spa

全部容器都定義有本身的iterator類型,在平時使用某種容器的iterator時,沒必要包含什麼特殊的頭文件。但一些特殊的iterator以及若干輔助的iterator函數,它們被定義於頭文件<iterator>中,因此你要是想實現iterator的完整功能,必需要加上該頭文件指針

#include<iterator>

迭代器的種類(按功能分類)code

1.forward(前向) 迭代器對象

forward 迭代器使一種input 迭代器且再前進讀取(reading forward)時提供額外保證。blog

容許操做索引

*iter          //訪問實際元素
iter->member   //訪問實際元素的成員member
++iter         //向前步進(返回新位置)
iter++         //向前步進(返回舊位置)
iter1==iter2   //判斷兩個迭代器是否相等
iter1!=iter2   //判斷兩個迭代器是否不等
iter1=iter2    //對迭代器賦值

2.bidirectional(雙向) 迭代器

bidirectional 迭代器在forward 迭代器的基礎上增長了回頭迭代的能力,它支持遞減操做符,可一步一步的後退。

--iter     //步退,返回新位置
iter--     //步退,返回舊位置

3.random-access(隨機訪問) 迭代器

random-access 迭代器在bidirectional 迭代器基礎上增長了隨機訪問能力,有了一系列新增操做

iter[n]              //訪問索引位置爲n的元素
iter+=n              //前進n個元素
iter-=n              //回退n個元素
iter+n               //返回iter以後的第n個元素
n+iter               //返回iter以後的第n個元素
iter-n               //返回iter以前的第n個元素
iter1-iter2          //返回iter1和iter2之間的距離
iter1<iter2          //判斷iter1是否在iter2以前
iter1>iter2          //判斷iter1是否在iter2以後
iter1<=iter2         //判斷iter1是否不在iter2以後
iter1>=iter2         //判斷iter1是否不在iter2以前

迭代器按定義方式有如下4種

1.正向迭代器

容器類名::iterator  迭代器名;

2.反向迭代器

容器類名::reverse_iterator  迭代器名;

3.常量正向迭代器

容器類名::const_iterator  迭代器名;

4.常量反向迭代器

容器類名::const_reverse_iterator  迭代器名;

迭代器相關輔助函數

1.advance

advance()可將迭代器的位置增長,增長幅度由實參決定。

#include<iterator>
void advance(InputIterator& pos,Dist n)

令名稱爲pos的input迭代器前進(或後退)n個元素,Dist是個template類型,一般它必須是個整形。注意,該操做並不檢查迭代器是否超過序列的end()。

該函數會根據迭代器種類採用最佳方案,最快爲常量複雜度,最慢爲線性複雜度。

使用實例

#include<iostream> #include<list> #include<iterator>
using namespace std; int main() { list<int> c={1,2,3,4,5,6,7,8,9}; list<int>::iterator pos=c.begin(); cout<<*pos<<endl; advance(pos,3); cout<<*pos<<endl; advance(pos,-1); cout<<*pos<<endl; return 0; }

2.distance

distance()函數用來處理兩個迭代器之間的距離。

#include<iterator> Dist distance(InputIterator pos1, InputIterator pos2)

返回兩個input迭代器pos1和pos2之間的距離。

注意:兩個迭代器必須指向同一容器。且若不是random-access 迭代器,則從pos1開始必需要能達到pos2。返回類型是迭代器相應的類型。

該函數對於非隨機訪問迭代器效能並非很好,應該避免使用。

使用實例

#include<iostream> #include<list> #include<iterator> #include<algorithm>
using namespace std; int main() { list<int> c={-3,-2,-1,0,1,2,3,4,5,6,7,8,9}; list<int>::iterator pos; pos=find(c.begin(),c.end(),5); if(pos!=c.end()) { cout<<"distance between beginning and 5: "
             <<distance(c.begin(), pos)<<endl; }else { cout<<"5 not found"<<endl; } return 0; }

find()後,數值爲5的元素的位置被賦值給pos,而後distance()計算出pos與起點之間的距離。

3.iter_swap

一個簡單的輔助函數,用來交換兩個迭代器所指的元素值。

#include<algorithm>
void iter_swap(ForwardIterator1 pos1,ForwardIterator2 pos2)

迭代器的類型沒必要相同,但其所指的兩個值必須能夠相互賦值。

反向迭代器

嚴格的來講,反向迭代器是一種迭代器適配器,該特殊迭代器能讓算法以反向模式進行操做。

全部標準容器都支持反向迭代器,你能夠理解爲,反向迭代器把正常迭代器的操做都顛倒過來了。

容器的成員函數rbegin()和rend()各返回一個reverse 迭代器,共同定義出一個反向的迭代區間。

相關文章
相關標籤/搜索