自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 迭代器,共同定義出一個反向的迭代區間。