STL之remove、remove_copy、remove_if、remove_copy_if

需要的头文件:
algorithm

源码:

//remove
template <class _ForwardIter, class _Tp>
_ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
                    const _Tp& __value) {
  __first = find(__first, __last, __value);
  _ForwardIter __i = __first;
  return __first == __last ? __first 
                           : remove_copy(++__i, __last, __first, __value);
}
//remove_copy
template <class _InputIter, class _OutputIter, class _Tp>
_OutputIter remove_copy(_InputIter __first, _InputIter __last,
                        _OutputIter __result, const _Tp& __value) {
  for ( ; __first != __last; ++__first)
    if (!(*__first == __value)) {
      *__result = *__first;
      ++__result;
    }
  return __result;
}
//remove_if
template <class _ForwardIter, class _Predicate>
_ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
                       _Predicate __pred) {
  __first = find_if(__first, __last, __pred);
  _ForwardIter __i = __first;
  return __first == __last ? __first 
                           : remove_copy_if(++__i, __last, __first, __pred);
}
//remove_copy_if
template <class _InputIter, class _OutputIter, class _Predicate>
_OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
                           _OutputIter __result, _Predicate __pred) {
  for ( ; __first != __last; ++__first)
    if (!__pred(*__first)) {
      *__result = *__first;
      ++__result;
    }
  return __result;
}

作用:
remove
移除[first,last)之中所有与value相等的元素。然而并不是真正的从容器中删除那些元素,而是将每一个不与value相等的元素轮番赋值给first之后的空间。
remove_copy
移除[first,last)之中所有与value相等的元素。然而并不是真正的从容器中删除那些元素,而是将结果复制到一个以result标示起始位置的容器身上。
remove_if
移除[first,last)区间内所有仿函数pred核定为true的元素。它并不是真正从容器中删除那些元素(参考remove)。每一个不符合pred条件的元素都会被轮番赋值给first之后的空间。
remove_copy_if
移除[first,last)区间内所有仿函数pred核定为true的元素。它并不是真正从容器中删除那些元素,而是将结果复制到一个以result标示起始位置的容器身上。新容器可以和原容器重叠,但如果针对新容器实际给值时,超越了新容器的大小,会发生无法预期的结果。

例子:

//例子只给出使用方法,有很多细节不予阐述
//具体细节参见 《STL源码剖析》
#include <algorithm>
#include <vector>
#include <iostream>
#include <functional>

using namespace std;

template <typename T>
void display(const T& x)
{
    cout << x << " ";
}
int main()
{
    ///////////////////////////////remove///////////////////////////////////////////
    {
        int ia[] = { 0,1,2,3,4,5,6,6,6,7,8 };
        vector<int> iv(begin(ia), end(ia));

        //移除(但不删除)元素6,尾端可能有残余数据(可以erase函数除去)
        remove(iv.begin(), iv.end(), 6);
        for_each(iv.begin(), iv.end(), display<int>); cout << endl;
        //0 1 2 3 4 5 7 8 6 7 8
    }

    ///////////////////////////////remove_copy///////////////////////////////////////////
    {
        int ia[] = { 0,1,2,3,4,5,6,6,6,7,8 };
        vector<int> iv(begin(ia), end(ia));
        //移除(但不删除)元素6,结果置于另一个区间
        vector<int> iv2(12);
        remove_copy(iv.begin(), iv.end(), iv2.begin(), 6);
        for_each(iv2.begin(), iv2.end(), display<int>); cout << endl;
        //0 1 2 3 4 5 7 8 (0 0 0 0)
    }
    ///////////////////////////////remove_if///////////////////////////////////////////
    {
        int ia[] = { 0,1,2,3,4,5,6,6,6,7,8 };
        vector<int> iv(begin(ia), end(ia));

        //移除(但不删除)小于6的元素,尾端可能有残余数据
        remove_if(iv.begin(), iv.end(), bind2nd(less<int>(), 6)); 
        for_each(iv.begin(), iv.end(), display<int>); cout << endl;
        //6 6 6 7 8 5 6 6 6 7 8
    }
    ///////////////////////////////remove_copy_if///////////////////////////////////////////
    {
        int ia[] = { 0,1,2,3,4,5,6,6,6,7,8 };
        vector<int> iv(begin(ia), end(ia));

        //移除(但不删除)小于7的元素,结果置于另一个区间
        vector<int> iv2(12);
        remove_copy_if(iv.begin(), iv.end(), iv2.begin(), bind2nd(less<int>(), 7));
        for_each(iv2.begin(), iv2.end(), display<int>); cout << endl;
        //7 8 0 0 0 0 0 0 0 0 0 0
    }


    return 0;
}

注意:
- remove中调用remove_copy,remove_if中调用了remove_copy_if,请理清它们之间为什么可以这么做。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值