c 中Iterator的實現和其他

2022-04-14 11:00:09 字數 1178 閱讀 2759

迭代器,iterator很多語言中都有的概念,對應c#中比如ienumerable類。

c#中的iterator是乙個複雜的語法糖,在定義乙個iterator時,一般通過乙個含有yield return的函式來實現。

這背後的思想是,這個iterator以及和它有關的變數,都被編譯器封裝在了乙個helper類中,在這個helper類中,還會維護乙個state狀態變數,維護當前iterator上次使用的狀態。

比如如下**中,countfrom返回乙個從startlimit的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語言裡面就有...