Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76654
  • 博文数量: 35
  • 博客积分: 1640
  • 博客等级: 上尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-05 11:44
文章分类

全部博文(35)

文章存档

2011年(1)

2008年(34)

我的朋友
最近访客

分类: C/C++

2008-05-05 12:52:59

迭代器是一种检查容器内元素并遍历元素的数据类型。

所有的标准库容器都定义了相应的迭代器类型,而只有少数容器支持下标操作。

例如:

vector :: iterator     iter;

定义了一个名为iter的变量,它的类型是由vector定义的iterator类型。每个标准库容器类型都定义了一个iterator成员,这里的iterator与迭代器实际类型的含义相同。

/*

听起来太晦涩了,也是自己水平不够,不过,我的理解就是,迭代器就是升级了的元素指针,以前的指针只用来加加减减访问元素,而这里被规范化,拥有了自己独立的包装,对外也提供了操作接口(迭代器的一些操作begin/end之类)。而且,还有一层意思就是,凡是实现了这样的操作功能的东西都可以称作迭代器。

*/

迭代器的操作:

赋值:

vector :: iterator     iter = ivec.begin( );

迭代器iter初始化为由明beginvector操作返回的值,假设vector不空,初始化后,iter即指该元素为ivec[0]

end操作返回的迭代器指向vector的“末端元素的下一个”(off-the-end iterator),表明它指向了一个不存在的元素。

自增:

迭代器可以自增操作以从容器中的一个元素移动到另一个元素。

解引用操作:

*iter 返回迭代器当前所指向的元素(这里叫做解引用操作符)。

由于end操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。

比较操作:

==!= 如果两个迭代器对象指向同一个元素,则它们相等。

 

const_iterator类型,只能用于读取容器内的元素,但不能改变其值。

当对普通iterator解引用的时候,得到某个元素的非const引用。而对const_iterator类型解引用的时候,则可以得到一个指向const对象的引用,是一个const值,不允许重写。

vector :: const_iterator iter = ivec.begin( );

 

const vector :: iterator iter = ivec.begin( );  constiterator对象:

/*

这两个的区别就是,const_iterator自身不是const的,但要求把它指向的元素当作const类型来对待,不管原来的元素是不是const,总之是只读不写。

const iterator自身是const,但不要求其指向的元素是const,所以它只能指向非const元素,而且只能指向某一个元素而不能再指向其他元素。——基本没什么用。

*/

警告:

任何改变vector长度的操作都会使已存在的迭代器失效。例如在调用push_back之后,就不能再信赖指向vector的迭代器的值了。(可能是因为,长度改变之后,vector的存储位置可能改变的原因吧,那么重新为迭代器赋值之后,还能接着用么?)

一个小问题:

计算mid迭代器:

OK:

vector::iterator mid = vi.begin() + vi.size() / 2;

ERROR:

Vector::iterator mid = ( vi.begin() + vi.end() ) / 2;

原因:两个迭代器相加的操作是未定义的。

 

理论:

迭代器的算术操作:

除了一次移动迭代器的一个元素的增量操作符外,vector(其他标准库容器迭代器很少)也支持其他的算术操作。这些操作称为迭代器算术操作(iterator arithmetic),包括:

iter + n

iter – n

iter1 – iter2 计算两个迭代器对象的距离,该距离是名为difference_typesigned类型的值它与size_type类似,也是由vector定义的。iter1iter2必须指向同一vector,或者指向vector末端之后的下一个元素。

 

也就是说,看似象个指针,但是操作起来是没有那么随便的!!!

 
 
vector和deque容器的迭代其提供额外的运算
C++定义的容器类型中,只有vector和deque(double-ended-queue/"deck")提供下面两种重要的运算集合:迭代器算术运算和关系操作。
Iter+n/iter-n
新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一位置(合法迭代器)
Iter1 += iter2 / iter1 -= tier2
这是迭代器加减法的复合赋值运算:将iter1加上或减去iter2的运算结果赋给iter1。
Iter1 - iter2
用来计算两个迭代器对象的距离,该距离是名为difference_type的signed类型的值,这里的difference_type类型类似于size_type类型,也是由vector定义的。
这两个迭代器必须指向同一个容器中的元素或超出容器末端的下一位置。
只适用于vector和deque容器。
>、>=、<、<=
这两个迭代器必须指向同一个容器中的元素或超出容器末端的下一位置。
只适用于vector和deque容器。

List容器的迭代器既不支持算术运算(加减法),也不支持关系运算(>、>=、<、<=
),它只提供前置和后置的自增、自减运算以及相等(不等)运算。
注意两个迭代器相加的解释。
阅读(1178) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~