[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());

猜你喜欢

转载自blog.csdn.net/u012906122/article/details/120168573
今日推荐