STL算法---remove系列

remove
●接受的是前向迭代器,返回的也是前向迭代器。
●移除但不删除。这个操作意思是原来那个位置的元素值改变了,但是该存储单元还是存在的。容器的大小不会发生变化。
●可能会有残余数据。可以利用erase()成员函数删除残余数据。
●代码实现:
template <typename ForwardIterator,typename T>
ForwardIterator remove(ForwardIterator first,ForwardIterator last,const T& value)
{
    first=find(first,last,value);
    ForwardIterator next=first;
    return first==last?first:remove_copy(++next,last,first,value);
}
通过调用remove_copy函数来实现数据的移动


remove_copy
●接收的是输入迭代器和输出迭代器,返回的也是输出迭代器
●原来的容器的数据和大小没有发生任何改变,把原来容器的数据复制到新容器内。
●新容器可以和原容器重叠,但是如果对新容器实际给值时,超越了原容器的大小时,会产生无法预期的结果。
●返回值指出被复制的最后一个元素的下一个位置。
●代码的实现:
template <typename InputIterator,typename OutputIterator,typename T>

OutputIterator remove_copy(InputIterator first,InputIterator last,OutputIterator result,const T& value)
{
    for(;first!=last;++first)
    {
        if(*first!=value)
        {
            *result=*first;
            ++result;
        }
    }
    return result;
}



remove_if
●移除给定范围内所有被函数对象判定为真的元素。
●并不是真正移除那些元素,只是改变那些符合条件的元素的值而已。容器的大小没有发生改变。
●可能会有残留的数据存在。可以使用erase成员函数删除那些残留元素。
●返回值指出整理后的最后元素的下一个位置。
●代码实现:
template <typename ForwardIterator,typename Predicate>
ForwardIterator remove_if(ForwardIterator first,ForwardIterator last,Predicate pred)
{
    first=find_if(first,last,pred);
    ForwardIterator next=first;
    return first==last?first:remove_copy_if(++next,last,first,pred);
}



remove_copy_if
●接受输入、输出迭代器和函数对象,返回输出迭代器对象
●将输入范围内被函数对象判定为真的那些函数复制到新容器中,原始容器的数据和大小没有发生改变。
●新容器可以和原容器重叠,但是如果对新容器实际给值时,超越了原容器的大小时,会产生无法预期的结果。
●返回值指出被复制的最后一个元素的下一个位置。
●代码实现:
template <typename InputIterator,typename OutputIterator,typename Predicate>
OutputIterator remove_copy_if(InputIterator first,InputIterator last,OutputIterator result,Predicate pred)
{
    for(;first!=last;++first)
    {
        if(!pred(*first))
        {
            *result=*first;
            ++result;
        }
    }
    return result;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值