容器類名::iterator 疊代器名;
容器類名::const_iterator 疊代器名;
容器類名::reverse_iterator 疊代器名;
容器類名::const_reverse_iterator 疊代器名;
*疊代器名
就表示疊代器指向的元素。通過非常數迭代器還能修改其指向的元素。++
操作。反向疊代器和正向疊代器的區別在於:
++
操作時,疊代器會指向容器中的後一個元素;++
操作時,疊代器會指向容器中的前一個元素。#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; //v是存放int型別變數的可變長陣列,開始時沒有元素 for (int n = 0; n<5; ++n) v.push_back(n); //push_back成員函數在vector容器尾部新增一個元素 vector<int>::iterator i; //定義正向疊代器 for (i = v.begin(); i != v.end(); ++i) { //用疊代器遍歷容器 cout << *i << " "; //*i 就是疊代器i指向的元素 *i *= 2; //每個元素變為原來的2倍 } cout << endl; //用反向疊代器遍歷容器 for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j) cout << *j << " "; return 0; }程式的輸出結果是:
i != v.end()
。++
操作後,會指向容器中的上一個元素。rbegin 成員函數返回指向容器中最後一個元素的疊代器,rend 成員函數返回指向容器中第一個元素前面的位置的疊代器,因此本迴圈實際上是從後往前遍歷整個陣列。++i
、++j
相比於寫i++
、j++
,程式的執行速度更快。回顧++
被過載成前置和後置運算子的例子如下:
CDemo CDemo::operator++ () { //前置++ ++n; return *this; } CDemo CDemo::operator ++(int k) { //後置++ CDemo tmp(*this); //記錄修改前的物件 n++; return tmp; //返回修改前的物件 }後置
++
要多生成一個區域性物件 tmp,因此執行速度比前置的慢。同理,疊代器是一個物件,STL 在過載疊代器的++
運算子時,後置形式也比前置形式慢。在次數很多的迴圈中,++i
和i++
可能就會造成執行時間上可觀的差別了。因此,本教學在前面特別提到,對迴圈控制變數i,要養成寫++i
、不寫i++
的習慣。==
和!=
運算子進行比較。--p
和p--
都是有定義的。--p
使得 p 朝和++p
相反的方向移動。p1<p2
的含義是:p1 經過若干次(至少一次)++
操作後,就會等於 p2。其他比較方式的含義與此類似。p2-p1
也是有定義的,其返回值是 p2 所指向元素和 p1 所指向元素的序號之差(也可以說是 p2 和 p1 之間的元素個數減一)。容器 | 疊代器功能 |
---|---|
vector | 隨機存取 |
deque | 隨機存取 |
list | 雙向 |
set / multiset | 雙向 |
map / multimap | 雙向 |
stack | 不支援疊代器 |
queue | 不支援疊代器 |
priority_queue | 不支援疊代器 |
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v(100); //v被初始化成有100個元素 for(int i = 0;i < v.size() ; ++i) //size返回元素個數 cout << v[i]; //像普通陣列一樣使用vector容器 vector<int>::iterator i; for(i = v.begin(); i != v.end (); ++i) //用 != 比較兩個疊代器 cout << * i; for(i = v.begin(); i < v.end ();++i) //用 < 比較兩個疊代器 cout << * i; i = v.begin(); while(i < v.end()) { //間隔一個輸出 cout << * i; i += 2; // 隨機存取疊代器支援 "+= 整數" 的操作 } }list 容器的疊代器是雙向疊代器。假設 v 和 i 的定義如下:
list<int> v; list<int>::const_iterator i;則以下程式碼是合法的:
for(i=v.begin(); i!=v.end(); ++i) cout << *i;以下程式碼則不合法:
for(i=v.begin(); i<v.end(); ++i) cout << *i;因為雙向疊代器不支援用“<”進行比較。以下程式碼也不合法:
for(int i=0; i<v.size(); ++i) cout << v[i];因為 list 不支援隨機存取疊代器的容器,也不支援用下標隨機存取其元素。
#include <list> #include <iostream> #include <algorithm> //要使用操作迭代器的函數模板,需要包含此檔案 using namespace std; int main() { int a[5] = { 1, 2, 3, 4, 5 }; list <int> lst(a, a+5); list <int>::iterator p = lst.begin(); advance(p, 2); //p向後移動兩個元素,指向3 cout << "1)" << *p << endl; //輸出 1)3 advance(p, -1); //p向前移動一個元素,指向2 cout << "2)" << *p << endl; //輸出 2)2 list<int>::iterator q = lst.end(); q--; //q 指向 5 cout << "3)" << distance(p, q) << endl; //輸出 3)3 iter_swap(p, q); //交換 2 和 5 cout << "4)"; for (p = lst.begin(); p != lst.end(); ++p) cout << *p << " "; return 0; }程式的輸出結果是: