SGI

remove_if

类别: 算法 组件类型: 函数

原型

template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
                          Predicate pred);

描述

Remove_if从范围内移除[first, last)每个元素x使得pred(x). 也就是说,remove_if返回一个迭代器new_last使得范围[first, new_last)不包含满足pred的元素。 [1] 范围内的迭代器[new_last, last)仍然可以解引用,但它们指向的元素未定义。Remove_if是稳定的,这意味着未移除元素的相对顺序保持不变。

定义

定义在标准头文件 algorithm 中,以及非标准向后兼容头文件 algo.h 中。

类型要求

先决条件

复杂度

线性。Remove_if精确地执行last - first次应用pred.

示例

从向量中移除所有偶数。
vector<int> V;
V.push_back(1);
V.push_back(4);
V.push_back(2);
V.push_back(8);
V.push_back(5);
V.push_back(7);

copy(V.begin(), V.end(), ostream_iterator<int>(cout, " "));
    // The output is "1 4 2 8 5 7"

vector<int>::iterator new_end = 
        remove_if(V.begin(), V.end(), 
                  compose1(bind2nd(equal_to<int>(), 0),
                           bind2nd(modulus<int>(), 2)));
V.erase(new_end, V.end()); [1]

copy(V.begin(), V.end(), ostream_iterator<int>(cout, " "));
    // The output is "1 5 7".

注释

[1] “移除” 的含义有些微妙。Remove_if不会销毁任何迭代器,也不会改变firstlast之间的距离。(它无法执行任何类似的操作)。例如,如果V是一个 向量remove_if(V.begin(), V.end(), pred)不会更改V.size(): V将包含与之前一样多的元素。Remove_if返回一个指向结果范围末尾的迭代器,其中元素已被移除;由此可见,该迭代器之后的元素无关紧要,可以丢弃。如果从 序列 中移除元素,则可以直接将其擦除。也就是说,从 序列 中移除元素的一种合理方法是S.erase(remove_if(S.begin(), S.end(), pred), S.end()).

另请参阅

remove, remove_copy, remove_copy_if, unique, unique_copy.
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息