分类: C/C++
2008-05-05 12:52:59
迭代器是一种检查容器内元素并遍历元素的数据类型。
所有的标准库容器都定义了相应的迭代器类型,而只有少数容器支持下标操作。
例如:
vector
定义了一个名为iter的变量,它的类型是由vector
/*
听起来太晦涩了,也是自己水平不够,不过,我的理解就是,迭代器就是升级了的元素指针,以前的指针只用来加加减减访问元素,而这里被规范化,拥有了自己独立的包装,对外也提供了操作接口(迭代器的一些操作begin/end之类)。而且,还有一层意思就是,凡是实现了这样的操作功能的东西都可以称作迭代器。
*/
迭代器的操作:
赋值:
vector
迭代器iter初始化为由明begin的vector操作返回的值,假设vector不空,初始化后,iter即指该元素为ivec[0]。
由end操作返回的迭代器指向vector的“末端元素的下一个”(off-the-end iterator),表明它指向了一个不存在的元素。
自增:
迭代器可以自增操作以从容器中的一个元素移动到另一个元素。
解引用操作:
*iter 返回迭代器当前所指向的元素(这里叫做解引用操作符)。
由于end操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。
比较操作:
==或!=, 如果两个迭代器对象指向同一个元素,则它们相等。
const_iterator类型,只能用于读取容器内的元素,但不能改变其值。
当对普通iterator解引用的时候,得到某个元素的非const引用。而对const_iterator类型解引用的时候,则可以得到一个指向const对象的引用,是一个const值,不允许重写。
vector
const vector
/*
这两个的区别就是,const_iterator自身不是const的,但要求把它指向的元素当作const类型来对待,不管原来的元素是不是const,总之是只读不写。
而const 的iterator自身是const,但不要求其指向的元素是const,所以它只能指向非const元素,而且只能指向某一个元素而不能再指向其他元素。——基本没什么用。
*/
警告:
任何改变vector长度的操作都会使已存在的迭代器失效。例如在调用push_back之后,就不能再信赖指向vector的迭代器的值了。(可能是因为,长度改变之后,vector的存储位置可能改变的原因吧,那么重新为迭代器赋值之后,还能接着用么?)
一个小问题:
计算mid迭代器:
OK:
vector
ERROR:
Vector
原因:两个迭代器相加的操作是未定义的。
理论:
迭代器的算术操作:
除了一次移动迭代器的一个元素的增量操作符外,vector(其他标准库容器迭代器很少)也支持其他的算术操作。这些操作称为迭代器算术操作(iterator arithmetic),包括:
iter + n
iter – n
iter1 – iter2 计算两个迭代器对象的距离,该距离是名为difference_type的signed类型的值它与size_type类似,也是由vector定义的。iter1和iter2必须指向同一vector,或者指向vector末端之后的下一个元素。
也就是说,看似象个指针,但是操作起来是没有那么随便的!!!