1.迭代器(iterator)是什么?
有道翻譯:iterator—— n. 迭代器、迭代程序
百度百科:迭代器(iterator)是一種對象,它能夠用來遍歷標准模板庫容器中的部分或全部元素,每個迭代器對象代表容器中的確定的地址。迭代器修改了常規指針的接口,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有機的統一起來。迭代器提供一些基本操作符:*、++、==、!=、=。這些操作和C/C++“操作array元素”時的指針接口一致。不同之處在於,迭代器是個所謂的復雜的指針,具有遍歷復雜數據結構的能力。
博客園博主!Vincent:迭代器是一種檢查容器內元素並遍歷元素的數據類型。C++更趨向於使用迭代器而不是下標操作,因為標准庫為每一種標准容器(如vector)定義了一種迭代器類型,而只用少數容器(如vector)支持下標操作訪問容器元素。
2.如何定義並初始化一個迭代器(iterator)?
每種容器都定義了自己的迭代器類型,但它們的定義格式都相同。
1) 正向迭代器定義方法:容器類名::iterator 迭代器名;
2) 常量正向迭代器定義方法:容器類名::const_iterator 迭代器名;
3) 反向迭代器,定義方法如下:容器類名::reverse_iterator 迭代器名;
4) 常量反向迭代器,定義方法如下:容器類名::const_reverse_iterator 迭代器名;
下面就用vector容器來進行舉例。
vector<int> vec; //定義一個名為vec的vector<int>類型的容器
vector<int>::iterator iter=vec.begin(); //定義了一個名為iter的vec容器迭代器,並將迭代器iter初始化為指向vec容器的第一個元素
vector<int>::iterator iter2=vec.end(); //定義了一個名為iter2的vec容器迭代器,將迭代器iter2初始化為指向vec容器的最后一個元素的下一個位置
博客園博主!Vincent:注意end並不指向容器的任何元素,而是指向容器的最后元素的下一位置,稱為超出末端迭代器。如果vector為空,則begin返回的迭代器和end返回的迭代器相同。一旦向上面這樣定義和初始化,就相當於把該迭代器和容器進行了某種關聯,就像把一個指針初始化為指向某一空間地址一樣。
3.迭代器(iterator)有哪些常用操作?
通過迭代器可以讀取它指向的元素,*迭代器名就表示迭代器指向的元素,通過非常量迭代器還能修改其指向的元素。
迭代器都可以進行++操作。反向迭代器和正向迭代器的區別在於:
對正向迭代器進行++
操作時,迭代器會指向容器中的后一個元素;
而對反向迭代器進行++
操作時,迭代器會指向容器中的前一個元素。
常用的迭代器按功能強弱分為輸入、輸出、正向、雙向、隨機訪問五種,這里只介紹常用的三種。
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 之間的元素個數減一)。
下圖(表一)列出了各個容器的迭代器功能:
順便一提:在 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 指向的值。
要使用上述模板,需要包含頭文件 algorithm。
迭代器的輔助函數
STL 中有用於操作迭代器的三個函數模板,它們是:
- advance(p, n):使迭代器 p 向前或向后移動 n 個元素。
- distance(p, q):計算兩個迭代器之間的距離,即迭代器 p 經過多少次 + + 操作后和迭代器 q 相等。如果調用時 p 已經指向 q 的后面,則這個函數會陷入死循環。
- iter_swap(p, q):用於交換兩個迭代器 p、q 指向的值。
要使用上述模板,需要包含頭文件 algorithm。