reverse_iterator

stl 容器大都有reverse_iterator, 用法跟 iterator 一样。然而,可能很少有人考虑过它的实现。

首先, reverse_iterator 大都由 std::reverse_iterator 包装 iterator 生成,如此,同样的遍历循环,reverse_iterator 在每个循环中要调用两次 iterator.operator--, 一次是 reverse_iterator::operator++, 一次是 reverse_iterator::operator*, reverse_iterator 的关键代码大致如下:

reference reverse_iterator<iterator>::operator*() { iterator t = this->iter; return *--t; } reverse_iterator<iterator>& reverse_iterator<iterator>::operator++() { --this->iter; return *this; }

如果不用 reverse_iterator, 如何反向遍历一个序列呢?

template<class BidirectIter, class Op> void reverse_for_each(BidirectIter first, BidirectIter last, Op op) { while (last != first) { --last; op(*last); } }
这样的反向遍历,每个循环只调用一次 BidirectIter::operator--, 比使用 reverse_iterator 的 for_each 更高效,除非编译器智能到可以消除那次多余的 operator--

然而这样的代码在极少数情况下也有问题,比如某个容器的 reverse_iterator 不是用 std::reverse_iterator 实现的,并且当正向 iterator 达到 end() 时就不能再调用 operator-- 回到上一个。febird::trbmap 就是这样一个例子,也许febird::trbmap在将来会修正这一点。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值