请问什麽是迭代器

一、请问什麽是迭代器?

迭代器是用来存取容器内存储的数据用的每种容器都有自己的迭代器~用法类是指针。。

请问什麽是迭代器

二、迭代器是什么

迭代器(iterator)是程序设计的软件设计模式,r,例如链表或阵列)上遍访容器的内容。迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全对象代表容器中的确针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容迭代器提供一些基本操作符:*、++、==、!=、=。这作array元素”时的指针接口一致。不同之处在于,迭代器是个所谓的复杂的指针,具有遍历复杂数据结构的能力。其下层运行机制取构。因此,每一种容器型都必须提供自己的迭代器。事实迭代器以嵌套的方式定义于内部。因此各种迭同。这直接导出了泛型程序设计的概念:所有操作行为都使用相同接口,虽然它功能迭代器使开发人员能够在类或结构中支持foreach迭代,而不必整个实现IEnumerable或者IEnumerator接口。只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代umerable接口ator接口的Current,MoveNext和Dispose方法。特点1.迭代器是可以返回相同类型值的有序序列的一段代码;2.迭代器可用作方法、运算符或get访问器的代码体;3.迭代器代码使用y次返回每个元素,yield break将终止迭代;4.可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有惟一的名称,并且可以在foreach语句中被客户端,代码调用如下所示:foreach(int x in SimpleClass.Iterator2){};5.迭代器的返回类rable和IEnumerator中的任意一种;6.迭代器是产生值的有序序列的一个语句块,不同于有一个 或多个yield语句存在的7.迭代器不是一种成员,它只是实现函数成员的方式,理解这一点是很重要的,一个通过迭代器实现的成员,可以被其他可能或不可能通过迭代器实现的成员8.迭代器块在C的元素,它们在几个方面受到限数成员声明的语义上,它们在语;9.yield关键字用于指定返回的值。到达yieldreturn语句时,会保存当前位置从此位置重新开始执行。 迭代器对集合类特别有用,它代不常用的数据结构(如二进制树)。

三、什么是迭代器?

你好,很高兴为你解答:

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

template

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

a.insert(1);

a.insert(2);

vector::iterator itra;

itra = a.begin();

printf(“%d/n”, *itra);

itra++;

printf(“%d/n”, *itra);

itra–; //基础指针类型都支持++,–,+,-等操作符

printf(“%d/n”, itra);

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

template

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

b.insert(1);

b.insert(2);

List::iterator itrb;

itrb = b.begin();

printf(“%d/n”, *itrb);

itrb++; // 该迭代器只支持++

printf(“%d/n”, *itrb);

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

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

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。