疊代器

疊代器

疊代器(iterator)有時又稱游標(cursor)是程式設計的軟體設計模式,可在容器(container,例如鍊表陣列)上遍訪的接口,設計人員無需關心容器的內容。

基本介紹

  • 中文名:疊代器
  • 外文名:iterator
  • 別稱:遊標卡尺
  • 提出者:張康健
  • 適用領域範圍:IT行業
解釋,功能,特點,簡介,一個簡單例子,

解釋

疊代器(iterator)是一種對象,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個疊代器對象代表容器中的確定的地址。疊代器修改了常規指針的接口,所謂疊代器是一種概念上的抽象:那些行為上像疊代器的東西都可以叫做疊代器。然而疊代器有很多不同的能力,它可以把抽象容器和通用算法有機的統一起來。
疊代器提供一些基本操作符:*、++、==、!=、=。這些操作和C/C++“操作array元素”時的指針接口一致。不同之處在於,疊代器是個所謂的複雜的指針,具有遍歷複雜數據結構的能力。其下層運行機製取決於其所遍歷的數據結構。因此,每一種容器型都必須提供自己的疊代器。事實上每一種容器都將其疊代器以嵌套的方式定義於內部。因此各種疊代器的接口相同,型號卻不同。這直接導出了泛型程式設計的概念:所有操作行為都使用相同接口,雖然它們的型別不同。

功能

疊代器使開發人員能夠在類或結構中支持foreach疊代,而不必整個實現IEnumerable或者IEnumerator接口。只需提供一個疊代器,即可遍歷類中的數據結構。當編譯器檢測到疊代器時,將自動生成IEnumerable接口或者IEnumerator接口的Current,MoveNext和Dispose方法。

特點

1.疊代器是可以返回相同類型值的有序序列的一段代碼;
2.疊代器可用作方法、運算符或get訪問器的代碼體;
3.疊代器代碼使用yieldreturn語句依次返回每個元素,yield break將終止疊代;
4.可以在類中實現多個疊代器,每個疊代器都必須像任何類成員一樣有惟一的名稱,並且可以在foreach語句中被客戶端,代碼調用如下所示:foreach(int x in SimpleClass.Iterator2){};
5.疊代器的返回類型必須為IEnumerable和IEnumerator中的任意一種;
6.疊代器是產生值的有序序列的一個語句塊,不同於有一個 或多個yield語句存在的常規語句塊;
7.疊代器不是一種成員,它只是實現函式成員的方式,理解這一點是很重要的,一個通過疊代器實現的成員,可以被其他可能或不可能通過疊代器實現的成員覆蓋和重載
8.疊代器塊在C#語法中不是獨特的元素,它們在幾個方面受到限制,並且主要作用在函式成員聲明的語義上,它們在語法上只是語句塊而已;
9.yield關鍵字用於指定返回的值。到達yieldreturn語句時,會保存當前位置。下次調用疊代器時將從此位置重新開始執行。 疊代器對集合類特別有用,它提供一種簡單的方法來疊代不常用的數據結構(如二進制樹)。

簡介

疊代器是一種檢查容器內元素並遍曆元素的可帶泛型數據類型。

一個簡單例子

#include<iostream>using namespace std;class _iterator{    private:            char *p;    public:            _iterator(char*str):p(str){}            char*&operator++()            {                    p+=1;//跟p++同價;                return p;            }};int main(){    char *p="This is C++ program";    _iterator it(p);    cout<<"++之前:"<<p<<endl;    char*p1=++it;//把地址向前加了一個char型長度,然後給指針p1    cout<<"++之後:"<<p1<<endl;    return 0;}
疊代器模式。Iterator對已集合類中的任何一個實現類,都可以返回這樣一個Iterator對象。就和循環一樣,好處是可以適用於任何一個類,而且實際上java對它進行了最佳化,比直接用index訪問快一點(這一點沒法考證,別人都這樣說)。不過呢,有一點很好,就是用起來確實很好用,加上泛型就更好用啦。比如說這樣一個例子ArrayList< String > arr = new ArrayList< String >();Iterator it = arr.iterator();疊代的時候可以這樣while( it .hasNext() ){ //做一些處理,比如 System.out.print( it.next );}配合上泛型,一個好處是it.next()可以不用類型轉換。以前用的時候是Object,還要自己轉,我感覺,Iterator和泛型簡直就是絕配哈。

相關詞條

熱門詞條

聯絡我們