迭代器
编辑本段解释
迭代器(
iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规
指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用
算法有机的统一起来。
迭代器提供一些基本操作符:*、++、==、!=、=。这些操作和C/C++“操作array元素”时的
指针接口一致。不同之处在于,迭代器是个所谓的
智能
指针,具有遍历复杂
数据结构的能力。其下层运行机制取决于其所遍历的
数据结构。因此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义于内部。因此各种迭代器的接口相同,型号却不同。这直接导出了
泛型
程序设计的概念:所有操作行为都使用相同接口,虽然它们的型别不同。
功能
迭代器使开发人员能够在类或结构中支持foreach迭代,而不必整个实现IEnumerable或者IEnumerator接口。只需提供一个迭代器,即可遍历类中的
数据结构。当
编译器检测到迭代器时,将自动生成IEnumerable接口或者IEnumerator接口的Current,MoveNext和Dispose方法。
特点
1.迭代器是可以返回相同类型值的有序序列的一段代码;
2.迭代器可用作方法、
运算符或get访问器的代码体;
3.迭代器代码使用
yieldreturn语句依次返回每个元素,yield break将终止迭代;
4.可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有惟一的名称,并且可以在foreach语句中被
客户端,代码调用如下所示:foreach(int x in SampleClass.Iterator2){};
5.迭代器的返回类型必须为IEnumerable和IEnumerator中的任意一种;
6.迭代器是产生值的有序序列的一个语句块,不同于有一个 或多个
yield语句存在的常规语句块;
7.迭代器不是一种成员,它只是实现函数成员的方式,理解这一点是很重要的,一个通过迭代器实现的成员,可以被其他可能或不可能通过迭代器实现的成员覆盖和
重载;
8.迭代器块在C#语法中不是独特的元素,它们在几个方面受到限制,并且主要作用在函数成员声明的语义上,它们在语法上只是语句块而已;
9.
yield关键字用于指定返回的值。到达
yieldreturn语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。 迭代器对集合类特别有用,它提供一种简单的方法来迭代不常用的
数据结构(如二进制树)。
简介
迭代器是一种检查容器内元素并遍历元素的数据类型。
编辑本段一个简单例子
#include <iostream>
using namespace std;
class _iterator
{
private:
char* p;
public:
_iterator(char* str):p(str){}
char*& operator++()
{
p+=1; //跟 p++同价;
return p;
}
};
int main()
{
char* p="This is C++ program";
_iterator it(p);
cout<<"++之前:"<<p<<endl;
char* p1=++it; //把地址向前加了一个char 型长度,然后给
指针p1
cout<<"++之后:"<<p1<<endl;
return 0;
}
迭代器模式。Iterator对已集合类中的任何一个实现类,都可以返回这样一个Iterator对象。就和循环一样,好处是可以适用于任何一个类,而且实际上java对它进行了优化,比直接用index访问快一点(这一点没法考证,别人都这样说)。不过呢,有一点很好,就是用起来确实很好用,加上
泛型就更好用啦。比如说这样一个例子ArrayList< String > arr = new ArrayList< String >();Iterator it = arr.iterator();迭代的时候可以这样while( it .hasNext() ){ //做一些处理,比如 System.out.print( it.next );}配合上
泛型,一个好处是it.next()可以不用类型转换。以前用的时候是Object,还要自己转,我感觉,Iterator和
泛型简直就是绝配哈。