题记:
继上篇所讲的vector,除了使用下标来访问vector对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator)。所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。迭代器是一种检查容器内元素并遍历元素的数据类型。
7.1 容器的iterator类型
每种容器类型都定义了自己的迭代器类型,如vector有:
vector<int>::iterator iter; //这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型
7.2 iterator的相关操作
- begin和end操作
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。
- 如果容器不为空,begin操作返回的迭代器指向容器的第一个元素;end操作返回的迭代器指向容器的“末端元素的下一个”,表明它指向了一个不存在的元素。
- 如果容器为空,则begin和end返回的迭代器相同。
- 自增和解引用操作
迭代器类型可使用解引用操作符(*)来访问迭代器所指向的元素。
解引用操作符返回迭代器当前所指向的元素。假设iter指向vector对象ivec的第一个元素,则*iter和ivec[0]就是指向同一个元素。
*iter = 0;//这条语句的作用就是将ivec[0]这个元素赋值为0
迭代器使用自增操作符(++)向前移动迭代器指向容器中下一个元素,即:如果iter指向容器的第一个元素,则++iter指向第二个元素
注意:由于end操作返回的迭代器不指向任何元素,因此不能对其进行解引用和自增操作。
- 迭代器比较操作——比较操作符(==或!=)
如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。
程序清单—01
cout<<"方法1:使用下标将容器元素清0"<<endl; for(vector<int>::size_type ix=0;ix !=ivec.size();++ix) { ivec[ix]=0; } cout<<"方法2:使用迭代器将容器元素清0"<<endl; for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end();++iter) { *iter=0; }
附:每个容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器中的元素,而不能改变其值。
程序清单—02
1 for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end();++iter) 2 { 3 *iter=0; 4 }
上述程序第3行编译出错: error C3892: “iter”: 不能给常量赋值
for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end();++iter) { cout<<*iter<<endl; }
上述程序正确,只是从容器中读取元素