1.指针和iterator都支持与整数进行+,-运算,而且其含义都是从当前位置向前或者向后移动n个位置
2.指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离
3.通过指针或者iterator都能够修改其指向的元素
指针是C语言里面就有的东西,而迭代器是C++里面才有的。
以下改自:https://blog.csdn.net/gogokongyin/article/details/51206225
1)迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->,,+± -等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作;
(2)迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用*取值后的值而不能直接输出其自身。
(3)在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。
ite = find(vec.begin(), vec.end(), 88);
vec.insert(ite, 2, 77); //迭代器标记的位置前,插入数据;
cout << *ite << endl; //会崩溃,因为迭代器在使用后就释放了,*ite的时候就找不到它的地址了;
注:迭代器使用完并不总是失效。
指针:
指针能指向函数而迭代器不行,迭代器只能指向容器。
总之,指针和迭代器是有很大差别的,虽然他们表现的行为相似,但是本质是不一样的!一个是类模板,一个是存放一个家伙的地址的指针变量
迭代器的类成员就是指针,是由几个指针构成的
迭代器紧密依赖于容器,迭代器是由容器来提供的。一般来讲,容器里定义迭代器的具体实现细节。
大多数容器都有迭代器,但不是所有的容器都有迭代器。比如,stack和queue这种容器就不提供迭代器。因为stack和queue需要根据一定的规则输入数据和输出数据,不可以通过迭代器遍历。
迭代器的分类
迭代器的行为如指针,到处跳,表示一个位置,我们一般分类是依据他的跳跃能力,每个分类是一个对应的struct定义。
迭代器可以声明如下格式:
iterator: 前向遍历,可读可写
const_iterator: 前向遍历,只读
reverse_iterator: 后向遍历,可读可写
const_reverse_iterator:后向遍历,只读
迭代器函数:
函数begin()返回一个迭代器指向容器的第一个元素。
函数end()返回一个迭代器指向容量的最后一个元素的下一位置。
函数rbegin()返回反向迭代器的开始,即指向原容器的最后一个元素。
函数rend()返回反向迭代器的最后一个元素的下一个位置,即指向原容器的第一个元素之前的位置。