2009-06-30 60 views
1

是否還有其他類型的迭代器?任何顯示不同類型的迭代器的鏈接?不同類型的迭代器

我知道的唯一一個是.NET的IEnumerable。

特別是對於C#,但所有其他人也歡迎。

+1

你能澄清你的意思是其他「類型」的迭代器?你是指以不同方式遍歷數據結構的迭代器嗎? – dborba 2009-06-30 17:46:20

+0

是的,確切地說。 。 – 2009-06-30 17:58:55

回答

1

迭代器在不同的語言中有很多不同的東西。

「不僅僅是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()

2

Wikipedia has an excellent article on iterators

在計算機科學中,一個迭代是 對象,允許程序員 橫移通過 集合中的所有元件,而不論其具體 實現。迭代器有時稱爲遊標,特別是在數據庫上下文中的 。

它還具有以下語言的代碼示例:

  • C++
  • C#和其它.NET語言
  • 的Java
  • 紅寶石
  • 的Python
  • PHP
+0

謝謝,我在讀這篇文章,但沒有列出其他迭代器類型,如:(猜測)一個迭代器類型必須實現,GetNext,GetPrev,並被稱爲「某事」。 – 2009-06-30 17:45:05

1

Iterator實際上是由Gang of Four創建的設計圖案的名稱。設計模式只是指導原則,因此每種語言都略有不同。

但是,在每種語言中,您都會遇到內置對象的實現方法,您可以爲自己的對象創建自己的實現。