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

来源:互联网 发布:在线网络代理翻墙 编辑:程序博客网 时间:2024/06/17 08:48

删除算法

删除算法指的是删除容器中满足相应条件的元素。
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. 返回目标区间的最后一个元素的后一个位置。

原创粉丝点击