C++ STL中迭代器(iterators)用於遍歷對象集合的元素。由於容器大小隨着插入刪除等操作動態改變,無法像靜態數組那樣獲取數組長度然后遍歷容器里的所有元素;這時就需要迭代器,每次從容器內第一個元素遍歷,直到迭代器等於容器的尾迭代器。這些集合可能是容器,也可能是容器的子集。迭代器按照定義方式分成以下四種。
1) 正向迭代器,定義方法如下:
容器類名::iterator 迭代器名;
2) 常量正向迭代器,定義方法如下:
容器類名::const_iterator 迭代器名;
3) 反向迭代器,定義方法如下:
容器類名::reverse_iterator 迭代器名;
4) 常量反向迭代器,定義方法如下:
容器類名::const_reverse_iterator 迭代器名。
其中,按照功能又可分為三類:
1) 正向迭代器。假設 p 是一個正向迭代器,則 p 支持以下操作:++p,p++,*p。此外,兩個正向迭代器可以互相賦值,還可以用==和!=運算符進行比較。
2) 雙向迭代器(list、set以及map支持雙向迭代器)。雙向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一個雙向迭代器,則--p和p--都是有定義的。--p使得 p 朝和++p相反的方向移動。
3) 隨機訪問迭代器(vector以及deque支持隨機訪問迭代器)。隨機訪問迭代器具有雙向迭代器的全部功能。若 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 之間的元素個數減一)。
注意:棧(stack)、隊列(queue)不支持迭代器。
用法舉例:(1)set的遍歷:
#include<iostream> #include<set> using namespace std; int main() { set<int> int_set; for (int i = 0; i < 5; i++) { int_set.insert(i); } for (set<int>::iterator it = int_set.begin(); it != int_set.end(); it++) { cout << *it << endl; }return 0; }
(2)map的遍歷:
#include<iostream> #include<map> using namespace std; int main() { map<int, char> my_map; my_map[0] = 'a'; my_map[1] = 'b'; my_map.insert(map<int, char>::value_type(2, 'c')); for (map<int, char>::iterator it = my_map.begin(); it != my_map.end(); it++) //map.begin()、map.end():返回map的首、尾迭代器 { cout << "key: " << it->first << " value: " << it->second << endl; }return 0; }
注意對map的遍歷過程中由於map是以<key, value>形式保存的元素,所以在迭代時並不止一個值,所以在C++ STL中將迭代器的iterator->first表示map元素的“key”,用iterator->second表示map元素的“value”。