不同类型的迭代器
回答
迭代器在不同的语言中有很多不同的东西。
“不仅仅是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