不同类型的迭代器

问题描述 投票:0回答:3

还有其他类型的迭代器吗?有显示不同类型迭代器的链接吗?

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

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

language-agnostic iterator
3个回答
2
投票

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

“不仅仅是 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++ 是我所知道的唯一一个实现了更复杂(且更强大)的东西的语言

特别是,因为 C++ 迭代器与它们指向的容器解耦,所以您可以轻松表示子范围(例如,为了表示上面向量中的前三个元素,我可以使用迭代器对

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 的 next 元素,从第一个搜索结果的最后一个开始,到序列的末尾结束。当然,此时找不到任何元素,因此返回

v.end()


2
投票

维基百科有一篇关于迭代器的优秀文章

在计算机科学中,迭代器是 对象允许程序员 遍历a的所有元素 集合,无论其具体情况如何 执行。迭代器是 有时称为游标,特别是 在数据库的上下文中。

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

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

1
投票

迭代器实际上是由四人帮创建的设计模式的名称。设计模式只是指导方针,因此每种语言的实现都略有不同。

但是在每种语言中,您都必须坚持其内置对象的实现,并且您可以为自己的对象创建自己的实现。

© www.soinside.com 2019 - 2024. All rights reserved.