四.c++中的算法--删除算法

删除算法

删除算法指的是删除容器中满足相应条件的元素。
1. 被删除元素会按顺序向前移动
2. 不能应用于关联式容器
3. 关联式容器的删除需要使用算法erase()
4. list容器,可以使用自身成员函数remove()

1.remove()

直接删除容器的元素
函数原型为:

template<class ForwardIt, class T>
ForwardIt remove(ForwardIt first, ForwardIt last, 
                       const T& value)
{
    ForwardIt result = first;
    for (; first != last; ++first) {
        if (!(*first == value)) {//删除值为value的元素
            *result++ = *first;
        }
    }
    return result;
}

2.remove_if()

条件删除算法。
函数原型;

template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last, 
                          UnaryPredicate p)
{
    ForwardIt result = first;
    for (; first != last; ++first) {
        if (!p(*first)) {
            *result++ = *first;
        }
    }
    return result;
}

说明:
1. 使用的是一元判断 p

3.remove_copy 和remove_copy_if

函数用于复制过程中删除元素。
函数原型为:

//版本一
template<class InputIt, class OutputIt, class T>
OutputIt remove_copy(InputIt first, InputIt last,
                     OutputIt d_first, const T& value)
{
    for (; first != last; ++first) {
        if (!(*first == value)) {
            *d_first++ = *first;
        }
    }
    return d_first;
}

//版本二
template<class InputIt, class OutputIt, class UnaryPredicate>
OutputIt remove_copy_if(InputIt first, InputIt last,
                        OutputIt d_first, UnaryPredicate p)
{
    for (; first != last; ++first) {
        if (!p(*first)) {
            *d_first++ = *first;
        }
    }
    return d_first;
}

说明:
1. 将[first,last)复制到目标区间
2. 形式一: 不复制值等于value的元素
3. 形式二: 不复制是判断式p为真的元素
4. 返回目标区间的最后一个元素的后一个位置

4. 移除重复元素

在vector,list ,deque, multiset,multimap容器中允许重复的元素。删除是可以使用算法:
- unique()
函数原型:

//版本一
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last)
{
    if (first == last)//为空
        return last;

    ForwardIt result = first;
    while (++first != last) {
        if (!(*result == *first)) {//将后面的值把前面重复的值覆盖
            *(++result) = *first;
        }
    }
    return ++result;
}


//版本二
template<class ForwardIt, class BinaryPredicate>
ForwardIt unique(ForwardIt first, ForwardIt last, 
                       BinaryPredicate p)
{
    if (first == last)
        return last;

    ForwardIt result = first;
    while (++first != last) {
        if (!p(*result, *first)) {
            *(++result) = *first;
        }
    }
    return ++result;
}

说明:
1. 的第一个版本使用operator==比较的元素,
2. 第二个版本使用给定的二元谓词p.
3. 返回唯一元素序列的最后一个元素的后一个位置。

5. 赋值过程中删除重复元素

  • unique_copy

函数原型:

//版本一
template<class ForwardIt, class OutputIt>
ForwardIt unique_copy(ForwardIt first, ForwardIt last,
                      OutputIt d_first)
{

    if (first == last)
        return d_first;

    *d_first = *first;
     while (++first != last) {
        if (!(*d_first == *first)) {
            *(++d_first) = *first;
        }
    }
    return ++d_first;
}


//版本二
template<class ForwardIt, class OutputIt, class BinaryPredicate>
ForwardIt unique_copy(ForwardIt first, ForwardIt last,
                            OutputIt d_first, BinaryPredicate p)
{

    if (first == last)
        return d_first;

    *d_first = *first;
    while (++first != last) {
        if (!p(*result, *first)) {
            *(++d_first) = *first;
        }
    }
    return ++d_first;
}

说明:
1. 的第一个版本使用operator==比较的元素,
2. 第二个版本使用给定的二元谓词p.
3. 返回目标区间的最后一个元素的后一个位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值