迭代器(C#)

    迭代器是一种对象,它能够用来遍历STL容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上象迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

  迭代器提供一些基本操作符:*、++、==、!=、=。这些操作和C/C++“操作array元素”时的指针接口一致。不同之处在于,迭代器是个所谓的smart pointers,具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义于内部。因此各种迭代器的接口相同,型别却不同。这直接导出了泛型程序设计的概念:所有操作行为都使用相同接口,虽然它们的型别不同。

  

功能

迭代器使开发人员能够在类或结构中支持foreach迭代,而不必整个实现IEnumerable或者IEnumerator接口。只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,将自动生成IEnumerable接口或者IEnumerator接口的Current,MoveNext和Dispose方法。

  

特点

1.迭代器是可以返回相同类型值的有序序列的一段代码;

  2.迭代器可用作方法、运算符或get访问器的代码体;

  3.迭代器代码使用yield return语句依次返回每个元素,yield break将终止迭代;

  4.可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有惟一的名称,并且可以在foreach语句中被客户端代码调用;

  5.迭代器的返回类型必须为IEnumerable和IEnumerator中的任意一种;

  6.迭代器是产生值的有序序列的一个语句块,不同于有一个 或多个yield语句存在的常规语句块;

  7.迭代器不是一种成员,它只是实现函数成员的方式,理解这一点是很重要的,一个通过迭代器实现的成员,可以被其他可能或不可能通过迭代器实现的成员覆盖和重载;

  8.迭代器块在C#语法中不是独特的元素,它们在几个方面受到限制,并且主要作用在函数成员声明的语义上,它们在语法上只是语句块而已;

一个简单例子

  #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;

  }

遍历Vector容器示例

//equivalent loop using iterators to reset all the elements in ivec to 0

  #include <iostream>

  #include <vector>

  using namespace std;

  int main()

  {

  vector<int> ivec(10,42);

  for (vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)

  *iter=0;

  return 0;

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值