迭代器

迭代器

迭代器(iterator)有時又稱游標(cursor)是程序設計的軟體設計模式,可在容器對象(container,例如鏈表或數組)上遍訪的介面,設計人員無需關心容器對象的內存分配的實現細節。

解釋


迭代器( iterator)是一種對象,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器對象代表容器中的確定的地址。迭代器修改了常規指針的介面,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用演演算法有機的統一起來。
迭代器提供一些基本操作符:*、++、==、!=、=。這些操作和C/C++“操作array元素”時的指針介面一致。不同之處在於,迭代器是個所謂的 複雜的指針,具有遍歷複雜數據結構的能力。其下層運行機製取決於其所遍歷的數據結構。因此,每一種容器型都必須提供自己的迭代器。事實上每一種容器都將其迭代器以嵌套的方式定義於內部。因此各種迭代器的介面相同,型號卻不同。這直接導出了泛型程序設計的概念:所有操作行為都使用相同介面,雖然它們的型別不同。
各種語言實現迭代器的方式皆不盡同,有些面向對象語言像Java,C#,Ruby,Python,Delphi都已將迭代器的特性內置語言當中,完美的跟語言集成,我們稱之隱式迭代器(implicit iterator),但像是C++語言本身就沒有迭代器的特色,但STL仍利用模板實現了功能強大的迭代器。STL容器的數據的內存地址可能會重新分配(reallocate),與容器綁定的迭代器仍然可以定位到重新分配后的正確的內存地址。
迭代器另一方面還可以集成生成器(generator)。有些語言將二者視為同一介面,有些語言如JavaScript則將之獨立化。

功能

迭代器使開發人員能夠在類或結構中支持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語句時,會保存當前位置。下次調用迭代器時將從此位置重新開始執行。迭代器對集合類特別有用,它提供一種簡單的方法來迭代不常用的數據結構(如二進位樹)。

簡介

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

示例


迭代器模式。Iterator對已集合類中的任何一個實現類,都可以返回這樣一個Iterator對象。就和循環一樣,好處是可以適用於任何一個類,而且實際上java對它進行了優化,比直接用index訪問快一點(這一點沒法考證,別人都這樣說)。不過呢,有一點很好,就是用起來確實很好用,加上泛型就更好用。
一種新形式的迭代器它提供了函數式編程中的generator,使用yield return ,類似於Python中使用的yield。
1
2
3
4
5
6
7
8
9
// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable GetEven(IEnumerable numbers)
{
foreach(int i in numbers)
{
if (i % 2 == 0) yield return i;
}
}