remove_copy_if

来源:互联网 发布:医学数据库检索方法 编辑:程序博客网 时间:2024/05/22 09:51
template<class InputIterator, class OutputIterator, class Predicate>   OutputIterator remove_copy_if(      InputIterator _First,       InputIterator _Last,       OutputIterator _Result,      Predicate _Pred

最后一个参数是谓词表达式,微软里面有个解释说

_First

解决输入的迭代器第一个元素的位置在元素中移除的范围。

_Last

解决输入的迭代器通过最终元素的位置一在元素中移除的范围。

_Result

解决输出的迭代器第一个元素的位置在元素中移除的目标范围。

_Pred

必须满足的一元谓词变为元素的值将被替换。

最后一个参数是一元谓词,

http://technet.microsoft.com/zh-cn/0ee18a2x(v=vs.98)

今天我自己试了试,发现二元谓词同样也可以,只不过我bind2nd了谓词的一个参数。

使用如下:

方法1:使用一元函数对象

template<typename _Ty>struct NoEqualByTimeStamp: public unary_function<_Ty, bool>{private:double TimeStamp;public:explicit NoEqualByTimeStamp<_Ty>(const double &ts):TimeStamp(ts){}bool operator()(const _Ty& _E)const{return _E.getTimeStamp() != TimeStamp;}};std::remove_copy_if(list.begin(),list.end(), back_inserter(list2),NoEqualByTimeStamp<Event>(time));

注:

back_inserter(list2)使用验证可以,但使用list2.begin()运行时显示迭代器出错,http://bbs.csdn.net/topics/360048951处讨论了这个问题,但我验证的结果并未完全正确,留待以后注意。


方法2:使用二元函数对象

template<typename _Ty1,typename _Ty2>struct EqualByTimeStamp: public unary_function<_Ty1,_Ty2, bool>{bool operator()(const _Ty1& _Left, const _Ty2& _Right)const{return _Left.getTimeStamp() == _Right;}};std::remove_copy_if(list.begin(),list.end(), back_inserter(list),bind2nd(not2(EqualByTimeStamp<Event,double>()),time));

注:这里利用bind2nd绑定了第二个参数_Ty2,由于remove_copy_if是取谓词的反义,所以要删除相等的元素的话要加上not2().

令注:remove_copy_if()不会删除实际元素,需要调用erase()删除