二 迭代器(二)相关辅助函数

一 迭代器相关辅助函数:

C++标准程序库为迭代器提供三个辅助函数:advance(),distance()和iter_swap()。

前两者给所有迭代器一些原本只有Random Access迭代器才有的能力。 


advance():前进(或后退)多个元素。

distance():处理迭代器之间的距离。

iter_swap():允许你交换两个迭代器的值。


二 advance():

可将迭代器的位置增加或者减少,增加或减少的幅度由参数决定。

函数原型:

#include<iterator>//实际定义与stl_iterator_base_funcs.h中。

void advance(InputIterator &pos, Distance n)


*使名为pos的迭代器前进或后退n个元素。

*对Bidirectional和Random Access迭代器而言,n可以为负值,表示后退n个元素。

*Distance是个template型别。通常应该是个整数型别。

*advance()并不检查迭代器是否超过序列的end(),所以调用advance()由可能导致未定义行为。


此函数总能根据迭代器的型别采用最佳方案:

如果面对是Random Access迭代器,此函数只是简单的调用pos+=n,因此具有常数复杂度。

对于其他任何类型则调用++pos(或--pos)n次,因此对于其他任何类型的迭代器,具有线性复杂度。


优点:

如果希望你的程序得以轻松的更换容器和迭代器的种类,应该使用advance()函数而不是operator +=。


缺点:

使用advance可能拿性能冒险,因为将advance应用与不提供“Random Access迭代器”的容器中,不容易感受到性能变差。

另外,advance()没有返回值,而operator+=会传回新位置,所以后者可以作为表达式的一部分。


三 distance():

distance函数用来处理两个迭代器之间的距离。


函数说明:

#include<iterator>

Dist distance(InputIterator pos1,InputIterator pos2)

*传回两个Input迭代器pos1和pos2之间的距离。

*两个迭代器必须指向同一个容器。

*如果不是Random Access迭代器,则从pos1开始往前走必须能够到达pos2,即pos2的位置必须和pos1相同或在左边。

*返回类型Dist的型别由迭代器决定:iterator_traits<InputIterator>::difference_type


对于Random Access迭代器,此函数仅仅是传回pos2-pos1,因此具备常数复杂度。

对于其他迭代器类型,distance()会不断增加pos1,直到抵达pos2为止,然后传回递增次数,即具有线性复杂度。


优点:

如果你希望将来可以轻松的更换容器型别和迭代器型别,那么应该使用distance()而不是operator -。

不过,这样可能你不会意识到将“Random Access迭代器”更换为其他类型迭代器,会造成性能下降的问题。


注意:

处理两个“non-Random Access迭代器”之间的距离必须十分小心。第一个迭代器的位置绝对不能位于第二个迭代器之后,否则会导致未定义行为。

对于Random Access迭代器,则返回负值,其他类型迭代器未定义。


四 iter_swap():

用来交换两个迭代器所指的元素值。

函数说明:

#include<algorithm>

void iter_swap(ForwordIterator1 pos1,ForwordIterator2 pos2);

*交换迭代器pos1和pos2所指的值。

*迭代器的型别可以不相同,但是所指的两个值必须可以相互赋值。


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值