c++迭代器


迭代器访问:迭代器检查容器内元素并遍历元素的数据类型
标准库为每一种标准容器定义了一种迭代器类型。
迭代器类型提供了比下标操作更方便的方法:所有的标准库容器都定义了相应的迭代器类型。
而只有少数的容器支持下标操作 。
因为迭代器对所有的容器都适用

容器的iterator类型
每一种容器类型都定义了自己的迭代器类型
每种容器都定义了一对命名为begin和and函数,用于返回迭代器。如果容器中有元素的话,由begin返回的迭代器指向第一个元素:
vector<int> ivec;
vector<int>::iterator iter = ivec.begin();

上述语句把iter初始化为begin的vector操作返回的值。假设vector不空,初始化之后,iter即指向该元素为ivec[0]。
由end操作返回的迭代器指向vector的“末端元素的下一个”。通常称为超出末端迭代器(off-the-end iterator),表明它指向了一个不存在的元素。
如果vector为空,begin返回的迭代器与end返回的迭代器相同。

迭代器的自增和解引用运算(*操作符)
*iter = 0;
解引用运算符返回迭代器当前所指的元素。
迭代器对象是把容器中的迭代器“向前移动一个位置”。因此,如果,iter指向第一个元素,则++iter指向第二个元素。
由于end操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。
迭代器的其他操作
另一对可执行于迭代器的操作就是比较:用==或!=操作符来比较两个迭代器,如果两个迭代器对象指向同一个元素,则他们相等,否则就不等。
迭代器应用程序实例
    vector<int>ivec;
    for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix) {  
        ivec[ix] = 0;
    }

    for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++) {
        *iter++;
    }

例子程序和vector下标操作的程序一样,如果vector程序是安全的。
如果ivec为空,则begin返回到迭代器不指向任何元素–由于没有元素所以他不能指向任何元素。
在这种情况下,从begin操作返回的迭代器从end操作返回的迭代器相同,因此for语句中测试条件立即失败。

const_iterator
前面的程序用vector::改变vector中的元素值。每种容器类型还定义了一种名为const_iterator的类型,该类型只能读取容器内元素,但不能改变其值。
不要把const_iterator 对象与const的iterator对象混淆起来。声明一个const迭代器时,必须初始化迭代器。一旦被初始化后,就不能改变它的值。
const_iterator 对象可以用于const vector或非const vector,因为不能改写元素值。
const迭代器这种类型几乎没什么用处:一旦它被初始化后,只能用它来改写其指向的元素,但不能使他指向任何其他元素。

迭代的算术操作
出了一次移动迭代器的一个元素的增量操作符外,vector迭代器也支持其他的操作符运算(其他标准库容器很少支持)
包括:
    iter+n
    iter-n
    iter1 - iter2

该表达式用于计算两个迭代器对象的距离,该距离是名为difference_type的signed类型的值,这里的difference_type类型类似于size_type类型,这也是由vector定义的。
足够大的存储任何两个迭代器对象间的距离。iter1与iter2两者必须都指向同一vector中的元素,或vector末端之后的下一个元素。‘
可以直接用算术操作来移动迭代器直接指向某个元素。
任何改变vector长度的操作 都会使已存在的迭代器是失效。例如,在调用push_back之后,就不能再信赖指向vector的迭代器的值了。
如下例子是错误的示范:

vector<int> vi(10, 2);
vector<int>::iterator mid = (vi.begin() + vi.end()) / 2;//error    

迭代器所加(减)的n是取自vector对象的元素个数范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值