不同容器的迭代器,其功能強弱有所不同。容器的迭代器的功能強弱,決定了該容器是否支援 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對於兩個隨機訪問迭代器 p1、p2,表示式p2-p1也是有定義的,其返回值是 p2 所指向元素和 p1 所指向元素的序號之差(也可以說是 p2 和 p1 之間的元素個數減一)。
表1:不同容器的迭代器的功能 容器
迭代器功能
vector
隨機訪問
deque
隨機訪問
list
雙向set/multiset
雙向map/multimap
雙向stack
不支援迭代器
queue
不支援迭代器
priority_queue
不支援迭代器
例如,vector 的迭代器是隨機迭代器,因此遍歷 vector 容器有以下幾種做法。下面的程式中,每個迴圈演示了一種做法。
#include #include using namespace std;
int main()
}
list 容器的迭代器是雙向迭代器。假設 v 和 i 的定義如下:
listv;則以下**是合法的:list::const_iterator i;
for(i=v.begin(); i!=v.end(); ++i)以下**則不合法:cout << *i;
for(i=v.begin(); icout << *i;雙向迭代器不支援用「
for(int i=0; icout << v[i];list 不支援隨機訪問迭代器的容器,也不支援用下標隨機訪問其元素。
在 c++ 中,陣列也是容器。陣列的迭代器就是指標,而且是隨機訪問迭代器。例如,對於陣列 int a[10],int * 型別的指標就是其迭代器。則 a、a+1、a+2 都是 a 的迭代器。
stl 中有用於操作迭代器的三個函式模板,它們是:
#include #include #include //要使用操作迭代器的函式模板,需要包含此檔案
using namespace std;
int main()
; list lst(a, a+5);
list ::iterator p = lst.begin();
advance(p, 2); //p向後移動兩個元素,指向7
cout << "1)" << *p << endl; //輸出 1)7
advance(p, -1); //p向前移動乙個元素,指向5
cout << "2)" << *p << endl; //輸出 2)5
list::iterator q = lst.end();
q--; //q 指向 2
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 << " ";
cout << endl;
return 0;
}
結果如下:
迭代器的輔助函式
迭代器的輔助函式 stl 中有用於操作迭代器的三個函式模板,它們是 advance p,n 使迭代器 p 向前或向後移動 n 個元素。distance p,q 計算兩個迭代器之間的距離,即迭代器 p 經過多少次 操作後和迭代器 q 相等。如果呼叫時 p 已經指向 q 的後面,則這個函式會陷入死迴圈。...
迭代器和輔助函式
迭代器 iterator 是連線容器和演算法的紐帶,為資料提供了抽象,使寫演算法的人不必關心各種資料結構的細節。迭代器提供了資料訪問的標準模型 物件序列,使對容器更廣泛的訪問操作成為可能。根據迭代器所支援的操作不同,在 stl中定義了如下 5種迭代器 迭代器類別 說明輸入 從容器中讀取元素。輸入迭代...
C STL迭代器輔助函式
平時零零碎碎用過,今天總結一下?該函式有多個過載,可以用於各類容器迭代器,可以讓乙個迭代器一次前進若干個元素,很好懂,舉個栗子 include include using namespace std intmain 輸出結果 1 32 include include using namespace ...