迭代器(iterator)是一种检查容器内元素并遍历元素的数据类型。
1、迭代器类型
(1)每种容器类型都定义了自己的迭代器类型,如vector:
//定义了一个名为iter的变量,它的数据类型是由`vector<int>`定义的iterator类型。
vector<int>::iterator iter;
//使用迭代器读取vector中的每一个元素
vector<int> ivec(10,1); //定义一个包含10个1的vector
for(vector<int>::iterator iter=ivec.begin(); iter!=ivec.end(); ++iter){
*iter=2; //使用 * 访问迭代器所指向的元素
}
(2)const_iterator:只能读取容器中的元素,而不能修改。
for(vector<int>::const_iterator citer=ivec.begin();citer!=ivec.end();citer++){
cout<<*citer;
//*citer=3; error
}
注意:vector<int>::const_iterator
和 const vector<int>::iterator
的区别
前者表示迭代器所指的内容不可修改;
后者表示迭代器本身不可修改。
const vector<int>::iterator newiter=ivec.begin();
*newiter=11; //可以修改指向容器的元素
//newiter++; //迭代器本身不能被修改
(3)iterator的算术操作
iter++
iter–
iter+n
iter-n
iter-iter2
迭代器的比较操作比较的是迭代器的位置前后关系,不是迭代器所指的内容,并且两个迭代器必须指向的是同一容器中的元素或者尾元素的下一个位置。
2、迭代器与指针的区别
(1)迭代器是类模板,模拟了指针的一些功能,通过重载指针的一些操作符,->,*,++ –等封装了指针,是一个“可遍历STL容器内全部或部分元素”的对象。根据不同类型的数据结构来实现不同的++,–等操作。
(2)迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用*取值后的值而不能直接输出其自身。
(3)在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素。通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。
ite=find(vec.begin(),vec.end(),88);
vec.insert(ite,2,77); //迭代器标记的位置前,插入数据;
cout<<*ite<<endl; //会崩溃,因为迭代器在使用后就释放了,*ite的时候就找不到它的地址了;
注:迭代器在使用后就释放了,不能再继续使用,但是指针可以!!
指针:
指针能指向函数而迭代器不行,迭代器只能指向容器;
指针只能用于某些特定的容器;
迭代器是指针的抽象和泛化,因此,指针也是迭代器。
3、C++11新特性
C++11针对数组引入了两个函数,分别为 begin 和 end,定义在iterator头文件中。
begin函数返回指向数组首地址的指针;
end函数返回指向数组尾元素下一位置的指针。
int array[] = {1,2,3};
int *beg = begin(array);
int *last = end(array);