template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred);
將範圍 `[first, last)` 中滿足一元謂詞 `pred` 返回 `true` 的元素複製到以 `result` 開始的目標範圍。相當於篩選複製操作。
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred) {
while (first != last) {
if (pred(*first)) {
*result = *first;
++result;
}
++first;
}
return result;
}
| 參數 | 說明 |
|---|---|
| first, last | 輸入迭代器,指定源範圍 `[first, last)` |
| result | 輸出迭代器,目標範圍起始位置 |
| pred | 一元謂詞,接受元素返回 bool,true 表示複製該元素 |
指向最後複製元素之後位置的輸出迭代器。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> v1{1, 5, 7, 8, 9, 10, 14, 15};
vector<int> v2;
v2.resize(10); // 預分配空間
// 複製大於 8 的元素
auto it = copy_if(v1.begin(), v1.end(), v2.begin(),
[](int x) { return x > 8; });
cout << "複製結果: ";
for (auto i = v2.begin(); i != it; ++i)
cout << *i << " ";
cout << endl;
return 0;
}
複製結果: 9 10 14 15

// 更推薦的用法:配合 back_inserter
vector<int> v2;
copy_if(v1.begin(), v1.end(), back_inserter(v2),
[](int x) { return x > 8; });