迭代器简介

来源:互联网 发布:淘宝店面装修 编辑:程序博客网 时间:2024/06/03 13:32

这里仅仅对迭代器进行简要介绍,后续还会对迭代器进行介绍。如下图,将以以下几个当面对迭代器进行介绍。


1.迭代器的基本知识。
1)迭代器是一种检查容器内元素并遍历元素的数据类型。也可以把它理解为一种特殊的指针。注意迭代器针对于容器的。
2)每一个标准容器都定义了一种迭代器的类型。比如vector<int>::iterator或者vector<int>::const_iterator;
:迭代器之前必须加作用域标识符“::”;二者的区别在于后者迭代器所指向容器内的元素只读,不能用于修改元素值


2.使用迭代器的原因
迭代器类型提供了比下标操作更通用化的方法,所有的容器都定义了迭代器,我们不需要了解容器内部,能够更方便的访问和操作容器内的元素。很多容器不支持下标索引的方式访问容器内的元素,因此有必要使用迭代器去访问容器内的元素


3.迭代器的操作
1)每种容器都定义了begin和end函数,用于返回迭代器。如果容器有元素的话,begin指向第一个元素;end指向容器的“末端元素的一个”,实质上end操作不指向容器中的任何元素,它只是起一个哨兵的作用,表示我们处理完容器中所有元素。
2)如果容器为空,begin返回的迭代器不指向任何元素和end返回的迭代器相等,均不指向任何元素。
3)迭代器支持*(解引用),->(指向),++(自增),+(加),-(减)。注意不支持自减运算,因为end返回的迭代器不指向容器。注意:容器内放的是内置类型(int,float等),则只能使用*iter访问;若容器内部放置的复杂类型,则可以使用*或者->来访问。

解引用操作

# include <iostream># include <string># include <vector>using std::vector;using std::string;using std::cout;using std::endl;using std::cin;int main(){vector<string> v;string s;while(cin>>s){v.push_back(s);//ctr+z结束输入}//用迭代器进行输出for(vector<string>::iterator iter = v.begin();iter != v.end();++ iter){cout<<* iter<<endl;}//const_iterator指向容器内对象,只能读不能修改。for(vector<string>::const_iterator it = v.begin();it != v.end();++ it){cout<<* it<<endl;}}

指向操作

# include <iostream># include <string># include <vector>using std::vector;using std::string;using std::cout;using std::endl;using std::cin;class Point{public:Point(int xx = 5,int yy = 5){x = xx;y = yy;}int GetX(){return x;}int GetY(){return y;}private:int x,y;};int main(){Point p1(1,2),p2;vector<Point> v;v.push_back(p1);v.push_back(p2);//用迭代器进行输出for(vector<Point>::iterator iter = v.begin();iter != v.end();++ iter){cout<<(*iter).GetX()<<endl;cout<<iter->GetY()<<endl;}}

自增运算,前面程序中已有不再介绍。
算术运算(+、-)
介绍算术元素之前先介绍以下几个类型。
size_type:用于保存string类和容器长度的无符号整型。必须要有作用域操作符,即string::size_type或vector<string>::size_type。

size_t:在cstddef头文件定义的无符号整型,用于保存数组的长度。

diffrence_type:用于保存string类和容器长度的有符号整型。

迭代器支持迭代算术操作。vector迭代器支持该算术操作,其他容器的迭代器很少支持迭代器算术操作。

比如iter+n或iter-n或iter1-iter2,减法元素会出现负数的结果,因此用difference_type来保存。

注:迭代器失效的情况,只要修改了容器的长度,迭代器就有可能失效。这点需要注意,在后续的章节会介绍此情况。

# include <iostream># include <string># include <vector>using std::vector;using std::string;using std::cout;using std::endl;using std::cin;class Point{public:Point(int xx = 5,int yy = 5){x = xx;y = yy;}int GetX(){return x;}int GetY(){return y;}private:int x,y;};int main(){Point p1(1,2),p2;vector<Point> v;v.push_back(p1);v.push_back(p2);vector<Point>::iterator it = v.begin();vector<Point>::iterator it1 = v.end();vector<Point>::difference_type n1,n2;n1 = it1 - it;n2 = it - it1;cout<<(it+1)->GetX()<<endl;//5cout<<n1<<endl;//2cout<<n2<<endl;//-2}


原创粉丝点击