一、迭代器简介
迭代器是一种检查容器内元素并遍历元素的数据类型。
标准库为每一种标准容器(包括vector)定义了一种迭代器类型,迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector 类型也是这样。
二、容器的iterator类型
每种容器都定义了自己的迭代器类型,如vector:
vector<int>::iterator iter;
三、begin 和end操作
每种容器都定义了一对命名为begin 和end的函数,用于返回迭代器,如果容器中有元素的话,由begin 返回的迭代器指向第一个元素:
vector<int>::iterator iter=ivec.begin();
由end 操作返回的迭代器指向vector的“末端元素的下一个”。通常称为超出末端迭代器。表明它指向了一个不存在的元素。如果vector 为空,begin 返回的迭代器与end返回的迭代器相同。
由end操作返回的迭代器并不指向vector中任何元素,相反,它只是起一个哨兵的作用,表示我们已处理完vector 中所有元素。
四、vector 迭代器的自增和解引用运算
迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素。
迭代器类型可使用解引用操作符(*操作符)来访问迭代器所指向的元素。
*iter=0.
迭代器的自增、自减操作:
++iter ;
--iter;
注意:由于end 操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。
五、迭代器的其它操作
--或!=操作符来比较两个迭代器。
六、迭代器应用的程序示例
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
*iter=0;
七、const_iterator
每种容器还定义了一种名为const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。
for(vector<string>::const_iterator iter=text.begin();iter!=text.end();++iter)
cout<<*iter<<endl;
八、迭代器的算数操作
除了一次移动迭代器的一个元素的增量操作符外,vector 迭代器(其他标准库容器迭代器很少)也支持其它算数操作,这些操作称为迭代器算术操作。包括:
iter+n;
iter-n;
iter1-iter2 : 计算两个迭代器对象的距离,该距离是名为difference_type 的signed类型的值。
注意:任何改变vector 长度的操作都会使已存在的迭代器失效。例如,在调用push_back 之后,就不能再信赖指向vector 的迭代器的值了。
九、练习
1、编写程序来创建有10个元素的vector 对象,用迭代器把把每个元素值改为当前值的2倍。
#include <iostream>
#include <vector>
using namespace::std;
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
vector<int> vec(9,0);
for (vector<int>::size_type i=0; i!=vec.size(); i++) {
vec[i]=i;
}
for (vector<int>::iterator iter=vec.begin(); iter!=vec.end(); ++iter) {
*iter=(*iter)*2;
}
//使用迭代器的方式集合中间元素
vector<int>::iterator mid=vec.begin()+vec.size()/2;
cout<<"mid is :"<<*mid<<endl;
return 0;
}
2、何时使用const迭代器的,又何时使用const_iterator? 两者有什么区别?
区别:const迭代器,可以改所指元素的值,但迭代器自身不能进行自增操作。
const_iterator 迭代器,不可以改变所指元素的值,但自身可以进行相应算数运算。