不同類型的迭代器
回答
迭代器在不同的語言中有很多不同的東西。
「不僅僅是C#迭代器」的一個明顯例子是C++迭代器,它基本上是一個序列中的標記。不像C#等價物,它不會「知道」序列開始或結束的位置,它只是知道它當前指向哪個元素,以及如何獲得下一個或可能的上一個元素。
這些迭代通常用在對(表示開始/序列的端部),是這樣的:
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5); // create a vector (equivalent to a C# List), and populate it with the numbers 1-5
// create two iterators, pointing to the beginning and end of this vector
std::vector<int>::iterator first = v.begin();
std::vector<int>::iterator last = v.end();
std::copy(first, last, std::ostream_iterator(std::cout)); // copy all elements found between first and last, to the standard output (in the shape of a special output iterator)
,或者如果我們手動遍歷它,我們可以這樣做:
for (vector<int>::iterator cur = v.begin(); cur != v.end(); ++cur) {
int val = *cur; // get the value pointed to by the iterator
cout << val; // print that value to the standard output
}
這個效果與第一個例子中的std::copy
函數相同,但在這裏您可以看到迭代器是如何實際用於在序列中移動的。有趣的是,你使用了一對迭代器,所以不是有一個迭代器,而是有一個「HasNext()」,「GetCurrent」和「MoveForward」函數(或類似的),你有兩個迭代器,而「HasNext」大致說來取代了平等測試。我們測試我們通過序列前進的迭代器是否等於給定的結束迭代器。如果是這樣,我們知道我們已經達到了序列的末尾。
這些迭代器進一步細分爲具有不同功能的不同類型。 矢量的迭代器屬於隨機訪問迭代器類別,這意味着從任何迭代器中,您都可以在單個恆定時間操作中訪問序列中的任何其他位置。例如,在上面的例子中,我可以從向量的開始做這個到達終點:
std::vector<int>::iterator last = v.begin() + 5; // advance 5 elements from begin
我還可以倒着走
std::vector<int>::iterator first= v.end() - 5; // go 5 elements back from the end
再就是雙向迭代器,這仍然允許你在序列中前後移動,但一次只能有一個元素(所以不用+和 - 運算符,你只有++和 - )。例如,這些用於鏈接列表。在鏈表中不能跳過5個元素,所以鏈表實現只暴露雙向迭代器,而不是隨機訪問。
這可以進一步縮小到一個前向迭代器(它只有++運算符),上面的ostream_iterator
就是一個例子,因爲它包裝了一個流,所以沒有辦法用這樣的迭代器向後移動。
其它大多數語言實現迭代器很像在C#中,雖然。ç發現++是唯一一個我所知道的,它實現的東西顯著更加複雜(強大)
特別是,由於C++迭代器是從分離你可以很容易地表示子範圍(例如,爲了表示上面向量中的前三個元素,我可以使用iterator pai r v.begin(), v.begin() + 3
。另一個例子是find
功能,其搜索在一個迭代範圍,並返回迭代指向找到的元素:
std::vector<int>::iterator result = std::find(v.begin(), v.end(), 3);
這個例子表示搜索整個矢量範圍爲所述第一元件與所述值3。它返回指向該元素的迭代器(如果沒有找到結果,則返回結束迭代器)
此迭代器可以與我們已有的迭代器配對,因此,例如,現在我們可以在子迭代器搜索結果和序列末尾:
std::vector<int>::iterator result2 = std::find(result + 1, v.end(), 3);
因此,上面將搜索值爲3的下一個元素,從第一個搜索結果之後的一個開始,到序列的結尾處結束。當然,沒有元素會被發現,所以它返回v.end()
。
Wikipedia has an excellent article on iterators:
在計算機科學中,一個迭代是 對象,允許程序員 橫移通過 集合中的所有元件,而不論其具體 實現。迭代器有時稱爲遊標,特別是在數據庫上下文中的 。
它還具有以下語言的代碼示例:
- C++
- C#和其它.NET語言
- 的Java
- 紅寶石
- 的Python
- PHP
謝謝,我在讀這篇文章,但沒有列出其他迭代器類型,如:(猜測)一個迭代器類型必須實現,GetNext,GetPrev,並被稱爲「某事」。 – 2009-06-30 17:45:05
Iterator實際上是由Gang of Four創建的設計圖案的名稱。設計模式只是指導原則,因此每種語言都略有不同。
但是,在每種語言中,您都會遇到內置對象的實現方法,您可以爲自己的對象創建自己的實現。
- 1. 不同類型的鏈接迭代器
- 2. 特定迭代器類型
- 3. 迭代器通過許多不同類型的隊列
- 4. typenamed迭代器不是一個類型
- 5. 迭代std :: vector(不帶迭代器)時使用哪種類型?
- 6. 迭代不同類的同名對象
- 7. 異類迭代器的C++迭代器
- 8. 的Java迭代器的原始類型
- 9. 的Java的ListIterator /迭代器類型
- 10. 迭代器大小不同
- 11. ES6迭代器的JSDoc類型名稱
- 12. 錯誤類型的迭代器使用
- 13. 迭代器類型的模板
- 14. 參數化類型的Java迭代器
- 15. 從不同的類訪問相同的迭代器列表
- 16. 迭代器類
- 17. 迭代不同類型的多個數組的最佳方法
- 18. 迭代不同類型化的設置成用戶定義的類型列表
- 19. Java字典迭代器類型問題
- 20. C++模板類型名稱迭代器
- 21. 迭代器中的迭代器在樹型集合中的迭代器
- 22. 原因在不同的迭代器
- 23. 使用相同類型的迭代器時,「操作符=不匹配」
- 24. C++迭代器類
- 25. 迭代器種類
- 26. 迭代器仿製藥,不能宣佈不匹配的類型(也許鑄造發行)的迭代器
- 27. C++ - 迭代器迭代器不編譯
- 28. 無類型對象不可迭代
- 29. 列表迭代類型不匹配
- 30. 迭代.plist字典。類型不匹配
你能澄清你的意思是其他「類型」的迭代器?你是指以不同方式遍歷數據結構的迭代器嗎? – dborba 2009-06-30 17:46:20
是的,確切地說。 。 – 2009-06-30 17:58:55