C++ 迭代器iterator和指针

相似之处

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定义。

  1. 输出型迭代器
  2. 输入型迭代器
  3. 前向迭代器
  4. 双向迭代器
  5. 随机访问迭代器

迭代器可以声明如下格式:
iterator: 前向遍历,可读可写
const_iterator: 前向遍历,只读
reverse_iterator: 后向遍历,可读可写
const_reverse_iterator:后向遍历,只读

迭代器函数:
函数begin()返回一个迭代器指向容器的第一个元素。
函数end()返回一个迭代器指向容量的最后一个元素的下一位置。
函数rbegin()返回反向迭代器的开始,即指向原容器的最后一个元素。
函数rend()返回反向迭代器的最后一个元素的下一个位置,即指向原容器的第一个元素之前的位置。

发布了61 篇原创文章 · 获赞 47 · 访问量 1592

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/104825111