您的位置:首页 > 编程语言 > C语言/C++

C++学习第七天:迭代器

2014-06-01 16:40 218 查看
C++学习第七天:迭代器

迭代器:iterator。
C++标准库中的集合类(容器)都定义了相应的迭代器类型,只有少数的集合类(容器)支持下标操作

容器的iterator类型,每种容器都定义有自己的迭代器,例如
vector<int>::iterator iter;
定义一个名为iter的变量,该变量的数据类型是由vector<int>定义的iterator类型,其实也就是iterator是一个指针,该指针指向vector<int>的对象。

容器都定义了一对命名为begin和end的函数,用于返回迭代器。
begin()返回的是去容器的第一个元素,end()返回并不指向vector中任何实际的元素,相反,它只是其一个哨兵的作用
,表示已到元素的末尾(java使用hasNext()方法判断是否还有下一个元素)。

迭代器访问容器中的元素,使用*操作符,其实也就是取值操作。例如:
vector<int>::iterator iter=ivec.begin();  //指向第一个元素
*iter=0; //访问迭代器指向的元素,并赋值

C++迭代器支持自增操作,也就是++iter表示指向下一个元素(java的迭代器使用next()方法指向下一个元素)。

迭代器可以执行的操作就是比较操作: == 和 !=  例如:
//遍历一个容器(集合)
for(vector<int>::iterator iter=ivec.begin();iter != ivec.end();++iter){
*iter.... //访问元素
}

使用const_iterator返回只读的迭代器(相当于指向常量的指针),只能读取元素的值,不能改变元素的值。
特别注意与 const iterator区别开来,const iterator是常量迭代器(常指针,一旦指向某个对象,则始终指向这个对象)例如:
const_iterator:指向常量的指针
for(vector<string>::const_iterator iter=text.begin();iter!=text.end();++iter){
//*iter=3         //修改元素的值将会报错,相当于给常量赋值
cout<<*iter<<endl;      //正常访问元素
}

const iterator:常指针
vector<int> nums(10);
const vector<int>::iterator cit=nums.begin();
*cit=1;
//下面这句代码报错cit不能指向其他元素
//++cit;

迭代器的算术操作:
+或-  n个位置:iter+n在该迭代器之前(之后)的第n个元素的位置,其中n必须是容器的size_type类型或difference_type类型。

iter1-iter2:计算两个迭代器对象的距离,该距离是名为difference_type的signed类型的值,这里的difference_type类型类似于size_type类词那个。
例如直接定位于容器对象的中间元素
vector::iterator mid=vi.begin()+vi.size()/2;

//两个迭代器的相加操作是未定义的,所以下面这句代码报错。
//vector::iterator mid=(vi.begin()+vi.end())/2;


int main(){
/*
//使用iterator遍历容器的元素
vector<int> ievc(10,33);
for(vector<int>::iterator iter=ievc.begin();iter!=ievc.end();++iter){
*iter*=2;
cout<<*iter<<" ";
}

*/
//测试const_iterator于const iterator 的区别
vector<int> ievc(10,33);
for(vector<int>::const_iterator iter=ievc.begin();iter!=ievc.end();++iter){
//尝试修改它的值。编译报错
//*iter=2;
cout<<*iter<<" ";
}
//const iterator
const vector<int>::iterator consit=ievc.begin();
//尝试修改它的值,正常运行
*consit=3;
//尝试指向下一个元素,编译报错
//	++consit;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: