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)
,它包含 first 和 last 之間的所有元素,包括 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
|
複雜度
線性複雜度,與 first 和 last 之間的 距離 成正比:將 pred 應用於每個元素,並對未移除的元素執行賦值操作。
資料競爭
訪問範圍 [first,last)
中的物件。
修改 result 和返回的迭代器之間的範圍內的物件。
異常
如果 pred、元素賦值或迭代器操作丟擲異常,則此函式也丟擲異常。
請注意,無效引數會導致未定義行為。