迭代器,iterator很多語言中都有的概念,對應c#中比如ienumerable
類。
c#中的iterator是乙個複雜的語法糖,在定義乙個iterator時,一般通過乙個含有yield return
的函式來實現。
這背後的思想是,這個iterator
以及和它有關的變數,都被編譯器封裝在了乙個helper類中,在這個helper類中,還會維護乙個state
狀態變數,維護當前iterator上次使用的狀態。
比如如下**中,countfrom
返回乙個從start
到limit
的int型iterator。
class myclass
public ienumerablecountfrom(int start)
}}
編譯器會將countfrom
轉換為乙個helper類,而其內部有乙個狀態機:
class myclass_enumerator: ienumerable < int >
}public bool movenext()
resume$0: ;
for (i = start; i <= this$0.limit; i++)
state$0 = 2;
return false;
}......
下面還有一些在這裡無關緊要的**…
} public ienumerablecountfrom(int start)
其中:
實際的邏輯,就寫在myclass_enumerator
類的movenext
中,每次向前取值後,通過current
返回當前值。
下次再次進入時,由於內部類保證了狀態,可以從上一次開始繼續取值。
這種內部類的方法,相比較遞迴方式,更節省棧空間,因為類是分配在堆上的。
這種通過yield return
+狀態機的思想,也是後面c#非同步程式設計async await
等的一種思想。
通過乙個helper類,記錄之前的狀態,下次進入直接從之前的狀態執行
C 迭代器iterator的實現原理
3.使用 4.總結 在經典的設計模式中,有一種迭代器模式,定義為 提供乙個物件來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。迭代器的主要優點如下。訪問乙個聚合物件的內容而無須暴露它的內部表示。遍歷任務交由迭代器完成,這簡化了聚合類。它支援以不同方式遍歷乙個聚合,甚至可以自定義迭代器的...
c 迭代器iterator 和 vector
初始化vector vectorv1 vectorv2 v1 vectorv3 n,i v3包含了n個值為i的元素 vectorv4 n v4含有初始化元素的n個副本 empty 判斷向量是否為空 begin 返回向量迭代器的首元素 end 返回向量迭代器末元素的下乙個元素 front 返回第乙個資...
C 迭代器iterator和指標
1.指標和iterator都支援與整數進行 運算,而且其含義都是從當前位置向前或者向後移動n個位置 2.指標和iterator都支援減法運算,指標 指標得到的是兩個指標之間的距離,迭代器 迭代器得到的是兩個迭代器之間的距離 3.通過指標或者iterator都能夠修改其指向的元素 指標是c語言裡面就有...