Функция copy_if
Функция copy_if копирует элементы из исходного диапазона
в целевой диапазон, но только те, которые удовлетворяют
заданному условию. В первый параметр мы передаем итератор
начала исходного диапазона, во второй - итератор конца
исходного диапазона, в третий - итератор начала целевого
диапазона, а в четвертый - предикат (функцию или лямбду),
которая возвращает true для копируемых элементов.
Синтаксис
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if(InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred);
Пример
Давайте скопируем из вектора src только четные числа
в вектор res:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> src = {1, 2, 3, 4, 5};
vector<int> res(src.size());
auto it = copy_if(src.begin(), src.end(), res.begin(),
[](int n) { return n % 2 == 0; });
res.resize(it - res.begin());
for (int n : res) {
cout << n << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
2 4
Пример
Давайте скопируем из вектора строк только те, которые
начинаются с символа 'a':
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
vector<string> src = {"abcde", "12345", "apple", "banana"};
vector<string> res(src.size());
auto it = copy_if(src.begin(), src.end(), res.begin(),
[](const string& s) { return s[0] == 'a'; });
res.resize(it - res.begin());
for (const string& s : res) {
cout << s << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
"abcde" "apple"