@specsoftdev live:.cid.8e17e9b93cabb607 specsoftdev@gmail.com
std::ranges::copy_if
Актуально для C++26.

#include <algorithm>
Актуально на 2025-06-15.


Define overload #1
template<input_iterator I, sentinel_for<I> S,
         weakly_incrementable O,
         class Proj = identity,
         indirect_unary_predicate<projected<I, Proj>> Pred>
requires indirectly_copyable<I, O>
constexpr ranges::copy_if_result<I, O>
    copy_if(I first, S last, O result, Pred pred, Proj proj = {});

Копирует элементы из диапазона [first, last] в result;
first, last - пара iterator-sentinel;
Example, possible implementation
Define overload #2
template<input_range R, weakly_incrementable O,
         class Proj = identity,
         indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
requires indirectly_copyable<iterator_t<R>, O>
constexpr ranges::copy_if_result<borrowed_iterator_t<R>, O>
    copy_if(R&& r, O result, Pred pred, Proj proj = {});

Копирует элементы из диапазона r в result;
r - объект, удовлетворяющий требования концепта input_range;
Example, possible implementation



[general_parameters]
result - любой объект, удовлетворяющий требования концепта weakly_incrementable. Алгоритм не осуществляет проверку переполнения буфера. Пользователь должен позаботиться о том, чтобы памяти на которую ссылается result, хватило для записи всех элементов.
pred - унарный предикат, любой "callable" объект, используемый для сравнения элементов.
proj - унарный предикат, любой "callable" объект. Используемый для преобразования элемента перед вызовом "pred".
[/general_parameters]


Возвращаемое значение

Вернёт два итератора, указывающих на концы диапазонов.



Examples


Example 1:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

namespace ranges = std::ranges;


int main()
{
    std::string copied = "wor1d1";
    std::vector<char> result {'h', 'e', 'l', 'l', 'o', ' '};

    const auto pred ([](unsigned char c) {
        return !std::isdigit(c);
    });

    ranges::copy_if(copied, std::back_inserter(result), pred);


    for (auto c : result)
        std::cout << c;
    std::cout << std::endl;
}



hello word





Changelog

C++20
Введён в стандарт.


See also

TODO

This page was last modified on 2025-06-15