频道栏目
首页 > 资讯 > 其他 > 正文

迭代器和指针差别

18-07-26        来源:[db:作者]  
收藏   我要投稿

迭代器与指针的差别:

迭代器:
(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<
 注:迭代器在使用后就释放了,不能再继续使用,但是指针可以!!

指针:
指针能指向函数而迭代器不行,迭代器只能指向容器;指针是迭代器的一种。指针只能用于某些特定的容器;迭代器是指针的抽象和泛化。所以,指针满足迭代器的一切要求。
总之,指针和迭代器是有很大差别的,虽然他们表现的行为相似,但是本质是不一样的!一个是类模板,一个是存放一个家伙的地址的指针变量。

实现一个迭代器。须要做一下工作:
1.定义5类迭代器的标志类,该标志类用于实现函数的差别调用(即重载),比如求两迭代器距离函数distance(iter1,iter2,tag)。移动函数advance(iter,n,tag)。

这五个标志类分别为:input_iterator_tag,output_iterator_tag。forward_iterator_tag,bidirectional_iterator_tag,random_access_iterator_tag。

2.对于每个iterator类,都必须包括5个属性,分别为:iterator_category、value_type、difference_type、pointer、reference。

3.定义一个迭代器的“属性榨汁机”iterator_traits,用于获取iterator的5中属性值。

4.定义迭代器的操作。分别为:

 1) 获取iterator的标志----->iterator_category(iter)。

 2)获取两迭代器差值的类型----->distance_type(iter)。

 3)获取迭代器的原始类型--------->value_type(iter);

 4)求两迭代器的距离---------------->distance(iter1,iter2,tag);

 5)将迭代器移动n位------------------>advance(iter,n,tag)。

一提到STL,必需要立即想到其基本的6个组成部件,各自是:容器、算法、迭代器、仿函数、适配器和空间分配器。本文主要介绍迭代器。

迭代器是连接容器和算法的一种重要桥梁。

  在STL中,迭代器主要分为5类。各自是:输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机訪问迭代器。

迭代器失效?没错。就是迭代器失效。
迭代器失效指的是迭代器原来所指向的元素不存在了或者发生了移动,此时假设不更新迭代器,将无法使用该过时的迭代器。
迭代器失效的根本原因是对容器的某些操作改动了容器的内存状态(如容器又一次载入到内存)或移动了容器内的某些元素。
使vector迭代器失效的操作
1.向vector容器内加入元素(push_back,insert)
向vector容器加入元素分下面两种情况:
1)若向vector加入元素后,整个vector又一次载入。即前后两次vector的capacity()的返回值不同一时候,此时该容器 内的全部元素相应的迭代器都将失效。
2)若该加入操作不会导致整个vector容器载入,则指向新插入元素后面的那些元素的迭代器都将失效。
2,删除操作(erase,pop_back,clear)
vector运行删除操作后,被删除元素相应的迭代器以及其后面元素相应的迭代器都将失效。
3.resize操作:调整当前容器的size
调整容器大小对迭代器的影响分例如以下情况讨论:
A.若调整后size>capacity,则会引起整个容器又一次载入,整个容器的迭代器都将失效。
B.若调整后size

相关TAG标签
上一篇:关于Linux操作系统的简单介绍
下一篇:xshell的常用命令总结分享
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站