迭代器的功能分類與輔助函式

2021-09-25 10:06:46 字數 2390 閱讀 9312

不同容器的迭代器,其功能強弱有所不同。容器的迭代器的功能強弱,決定了該容器是否支援 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 ...