什么是迭代器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是迭代器?相关的知识,希望对你有一定的参考价值。

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

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

扩展资料:

迭代器的特点:

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

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

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

4.可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有惟一的名称,并且可以在foreach语句中被客户端,代码调用如下所示:foreach(int x in SimpleClass.Iterator2);

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

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

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

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

9.yield关键字用于指定返回的值。到达yieldreturn语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。 迭代器对集合类特别有用,它提供一种简单的方法来迭代不常用的数据结构(如二进制树)。

参考资料:百度百科-迭代器

参考技术A 你好,很高兴为你解答:
在学习c++ STL的时候,整天碰到迭代器,也整天用,但是,到底它是个什么东西,很多人没有一个认识。这里我通过几个小的DEMO,来看看迭代器。首先我实现了一个十分简陋的vector类:

template <class T>
class vector
private:
T* pbegin;
int n; //当前大小
public:
vector()
pbegin = new T[100]; //暂时先固定大小
n = 0;


T* begin()
return pbegin;

void insert(T d)
pbegin[n++] = d;

typedef T* iterator; //vector的迭代器就是基础指针类型
;

我们知道,vector是数组实现的,也就是说,只要知道数组的首地址,就能知道后面每个元素的位置,所以,访问vector的迭代器,其实就是一个基础的指针类型,我们可以通过++,--等操作,来遍历访问该vector。

//测试vector
vector<int> a;
a.insert(1);
a.insert(2);
vector<int>::iterator itra;
itra = a.begin();
printf("%d/n", *itra);
itra++;
printf("%d/n", *itra);
itra--; //基础指针类型都支持++,--,+,-等操作符
printf("%d/n", *itra);

哇~~,原来vector的迭代器那么简单,那么,我们来考虑一下List,这是链表,我们知道,链表每个元素都存储在不同的位置,我们一般通过指向下一个元素的next指针来找到下一个元素。那么,我们怎么样来设计一个迭代器,然后可以直接对这个迭代器进行++,--等操作二遍历访问整个链表呢:

template <class T>
class List
private:
struct Node //链表的节点
T data;
Node* next;
;
Node* pbegin; //表头
class List_iterator //链表的迭代器
Node* cur; //当前指向
public:
void operator = (Node* ptr)
cur = ptr;

void operator ++ ()
cur = cur->next;

// ...还可以重载-- + -等操作符
T operator * ()
return cur->data;

;
public :
List()
pbegin=NULL;

Node* begin()
return pbegin;

void insert(T d)
Node* p=pbegin;
while(p && p->next) p=p->next;
Node* t = new Node;
t->data = d;
t->next = NULL;
if(pbegin==NULL)
pbegin = t;
else
p->next = t;

typedef List_iterator iterator; //List的迭代器是一个类
;

为List设计的迭代器是一个类,这个类支持++操作来向后移动遍历链表:

/测试List
List<int> b;
b.insert(1);
b.insert(2);
List<int>::iterator itrb;
itrb = b.begin();
printf("%d/n", *itrb);
itrb++; // 该迭代器只支持++
printf("%d/n", *itrb);

通过这两个例子,可以看出,迭代器是跟容器紧密结合的,不同的容器,它的迭代器不同,但是,他们有共同的目标,就是可以通过该迭代器,来遍历访问这个容器里面的元素。这样带来的好处是在STL设计算法时,可以脱离容器而设计更加通用的算法。比如,在容器中查找一个元素。查找,这个操作一般来说就是遍历整个集合,然后找到那个要找的元素,但是,如果没有迭代器,我们需要为vector和List设计两个查找算法,因为找下一个元素在vector和List中的操作不同。同样的思想却要两套代码,显然这是不优秀的。

有了模板,我们可以将算法和特定的数据分离开来,而有了迭代器,我们可以将算法和特定的容器分离开来。

以上是关于什么是迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

什么是迭代器,Python迭代器及其用法

迭代器和生成器

25Python之迭代器

迭代器与生成器

迭代器

迭代器生成器面向过程编程