不同类型的迭代器

时间:2009-06-30 17:36:57

标签: language-agnostic iterator

是否有其他类型的迭代器?任何显示不同类型迭代器的链接?

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

特别是对于C#,但也欢迎所有其他人。

3 个答案:

答案 0 :(得分:2)

Wikipedia has an excellent article on iterators

  

在计算机科学中,迭代器是一种   允许程序员使用的对象   遍历a的所有元素   集合,无论其具体如何   实现。迭代器是   有时候称为光标   在数据库的上下文中。

它还包含以下语言的代码示例:

  
      
  • C ++
  •   
  • C#和其他.NET语言
  •   
  • 爪哇
  •   
  • 红宝石
  •   
  • 的Python
  •   
  • PHP
  •   

答案 1 :(得分:2)

迭代器在不同的语言中有很多不同的东西。

“不仅仅是C#Iterator”的一个显而易见的例子是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 ++是我所知道的唯一一个实现更复杂(和更强大)的东西

特别是,因为C ++迭代器与它们指向的容器分离,所以你可以很容易地表示子范围(例如,为了表示上面向量中的前三个元素,我可以使用迭代器对{{1}另一个例子是v.begin(), v.begin() + 3函数,它在迭代器范围内搜索,并返回一个指向找到的元素的迭代器:

find

这个例子说要在第一个元素的整个向量范围内搜索值3.它返回一个指向该元素的迭代器(如果没有找到结果,则返回end-iterator)

这个迭代器可以与我们已经拥有的迭代器配对,例如,我们现在可以搜索搜索结果和序列结尾之间的子范围:

std::vector<int>::iterator result = std::find(v.begin(), v.end(), 3);

因此,上面将搜索值为3的 next 元素,从第一个搜索结果的一个开始,到序列的结尾。当然,之后不会找到任何元素,因此返回std::vector<int>::iterator result2 = std::find(result + 1, v.end(), 3);

答案 2 :(得分:1)

Iterator实际上是Gang of Four创建的设计模式的名称。设计模式只是指导方针,因此每种语言的实现方式略有不同。

但是在每种语言中,您都会遇到内置对象的实现,并且可以为自己的对象创建自己的实现。