function template
<algorithm>

std::remove_copy_if

template <class InputIterator, class OutputIterator, class UnaryPredicate>  OutputIterator remove_copy_if (InputIterator first, InputIterator last,                                 OutputIterator result, UnaryPredicate pred);
Copy range removing values
將範圍 [first,last) 中的元素複製到以 result 開頭的範圍中,除非 pred 返回 true

結果範圍的長度比 [first,last) 短,減少的數量等於匹配(即“移除”)的元素數量。

此函式模板的行為等同於
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class InputIterator, class OutputIterator, class UnaryPredicate>
  OutputIterator remove_copy_if (InputIterator first, InputIterator last,
                                 OutputIterator result, UnaryPredicate pred)
{
  while (first!=last) {
    if (!pred(*first)) {
      *result = *first;
      ++result;
    }
    ++first;
  }
  return result;
}

引數

first, last
Forward iterators 指向序列的初始和最終位置。使用的範圍是 [first,last),它包含 firstlast 之間的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
result
輸出迭代器,指向儲存結果序列的範圍的起始位置。
指向的型別應支援被賦值為範圍 [first,last) 中某個元素的值。
pred
一元函式,接受範圍中的元素作為引數,並返回一個可轉換為 bool 的值。返回的值指示該元素是否應從副本中移除(如果為 true,則不復制)。
該函式不得修改其引數。
這可以是函式指標,也可以是函式物件。

這些範圍不應重疊。

返回值

指向已複製範圍末尾的迭代器,該範圍包括 [first,last) 中的所有元素,但不包括 pred 返回 true 的那些元素。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// remove_copy_if example
#include <iostream>     // std::cout
#include <algorithm>    // std::remove_copy_if
#include <vector>       // std::vector

bool IsOdd (int i) { return ((i%2)==1); }

int main () {
  int myints[] = {1,2,3,4,5,6,7,8,9};
  std::vector<int> myvector (9);

  std::remove_copy_if (myints,myints+9,myvector.begin(),IsOdd);

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

輸出
myvector contains: 2 4 6 8 0 0 0 0 0


複雜度

線性複雜度,與 firstlast 之間的 距離 成正比:將 pred 應用於每個元素,並對未移除的元素執行賦值操作。

資料競爭

訪問範圍 [first,last) 中的物件。
修改 result 和返回的迭代器之間的範圍內的物件。

異常

如果 pred、元素賦值或迭代器操作丟擲異常,則此函式也丟擲異常。
請注意,無效引數會導致未定義行為

另見