[7 使用STL] 47. 避免产生直写型(write-only)的代码

假定有一个vector<int>,现在要删除其中所有<x的元素,但是保留最后>=y的元素之前的所有元素。

{1,1,3,...,7,8,1,2} x=3,y=8 则需要删除最后的1和2元素

解决该问题的思路大致如下:

1 通过以reverse_iterator作为参数调用find_if,找到容器中最后一个其值>=y的元素

2 通过erase_remove习惯用法杀出区间中符合条件的元素

看下面的代码:

vector<int> v;
int x,y;
...
v.erase(
    remove_if(find_if(v.rbegin(), v.end(), bind2nd(greater_equal<int>(), y)).base(), 
              v.end(),
              bind2nd(less<int>(), x)),
    v.end()
);

上面代码有两方面不妥之处:

1 过于复杂的嵌套函数调用。

2 若要理解这条语句,必须有很强的STL背景。它使用了find和remove算法的if形式;它使用了reverse_iterator;它将reverse_iterator转换为iterator;它使用了bind2nd;它创建了匿名的函数对象;它还使用了erase-remove习惯用法。

下面是一种分解的做法:

typedef vector<int>::iterator VecIntIter;
VecIntIter rangeBegin = find_if(v.rbegin(), v.rend(), bind2nd(greater_equal<int>(), y)).base();
v.erase(remove_if(rangeBegin, v.end(), bind2nd(less<int>(), x)), v.end());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值