C++迭代器(STL迭代器)iterator詳解


C++迭代器(STL迭代器)iterator詳解
要訪問順序容器和關聯容器中的元素,需要通過“迭代器(iterator)”進行。迭代器是一個變量,相當於容器和操縱容器的算法之間的中介。迭代器可以指向容器中的某個元素,通過迭代器就可以讀寫它指向的元素。從這一點上看,迭代器和指針類似。
迭代器按照定義方式分成以下四種。
1) 正向迭代器,定義方法如下:
容器類名::iterator 迭代器名;
2) 常量正向迭代器,定義方法如下:
容器類名::const_iterator 迭代器名;
3) 反向迭代器,定義方法如下:
容器類名::reverse_iterator 迭代器名;
4) 常量反向迭代器,定義方法如下:
容器類名::const_reverse_iterator 迭代器名;
迭代器用法示例
通過迭代器可以讀取它指向的元素,*迭代器名就表示迭代器指向的元素。通過非常量迭代器還能修改其指向的元素。
迭代器都可以進行++操作。反向迭代器和正向迭代器的區別在於:
對正向迭代器進行++操作時,迭代器會指向容器中的后一個元素;
而對反向迭代器進行++操作時,迭代器會指向容器中的前一個元素。
迭代器的功能分類
不同容器的迭代器,其功能強弱有所不同。容器的迭代器的功能強弱,決定了該容器是否支持 STL 中的某種算法。例如,排序算法需要通過隨機訪問迭代器來訪問容器中的元素,因此有的容器就不支持排序算法。
常用的迭代器按功能強弱分為輸入、輸出、正向、雙向、隨機訪問五種,這里只介紹常用的三種。
1) 正向迭代器。假設 p 是一個正向迭代器,則 p 支持以下操作:++p,p++,*p。此外,兩個正向迭代器可以互相賦值,還可以用==和!=運算符進行比較。
2) 雙向迭代器。雙向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一個雙向迭代器,則--p和p--都是有定義的。--p使得 p 朝和++p相反的方向移動。
3) 隨機訪問迭代器。隨機訪問迭代器具有雙向迭代器的全部功能。若 p 是一個隨機訪問迭代器,i 是一個整型變量或常量,則 p 還支持以下操作:
p+=i:使得 p 往后移動 i 個元素。
p-=i:使得 p 往前移動 i 個元素。
p+i:返回 p 后面第 i 個元素的迭代器。
p-i:返回 p 前面第 i 個元素的迭代器。
p[i]:返回 p 后面第 i 個元素的引用。
此外,兩個隨機訪問迭代器 p1、p2 還可以用 <、>、<=、>= 運算符進行比較。p1<p2的含義是:p1 經過若干次(至少一次)++操作后,就會等於 p2。其他比較方式的含義與此類似。
對於兩個隨機訪問迭代器 p1、p2,表達式p2-p1也是有定義的,其返回值是 p2 所指向元素和 p1 所指向元素的序號之差(也可以說是 p2 和 p1 之間的元素個數減一)。
表1所示為不同容器的迭代器的功能。
容器 迭代器功能
vector 隨機訪問
deque 隨機訪問
list 雙向
set / multiset 雙向
map / multimap 雙向
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器
在 C++ 中,數組也是容器。數組的迭代器就是指針,而且是隨機訪問迭代器。例如,對於數組 int a[10],int * 類型的指針就是其迭代器。則 a、a+1、a+2 都是 a 的迭代器。
迭代器的輔助函數
STL 中有用於操作迭代器的三個函數模板,它們是:
advance(p, n):使迭代器 p 向前或向后移動 n 個元素。
distance(p, q):計算兩個迭代器之間的距離,即迭代器 p 經過多少次 + + 操作后和迭代器 q 相等。如果調用時 p 已經指向 q 的后面,則這個函數會陷入死循環。
iter_swap(p, q):用於交換兩個迭代器 p、q 指向的值。

 


免責聲明!

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



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