Namespaces
Variants

std::ranges:: remove_copy, std::ranges:: remove_copy_if, std::ranges:: remove_copy_result, std::ranges:: remove_copy_if_result

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
Definido en el encabezado <algorithm>
Firma de llamada
(1)
template < std:: input_iterator I, std:: sentinel_for < I > S,

std:: weakly_incrementable O, class T, class Proj = std:: identity >
requires std:: indirectly_copyable < I, O > &&
std:: indirect_binary_predicate
< ranges:: equal_to , std :: projected < I, Proj > , const T * >
constexpr remove_copy_result < I, O >

remove_copy ( I first, S last, O result, const T & value, Proj proj = { } ) ;
(desde C++20)
(hasta C++26)
template < std:: input_iterator I, std:: sentinel_for < I > S,

std:: weakly_incrementable O, class Proj = std:: identity ,
class T = std :: projected_value_t < I, Proj > >
requires std:: indirectly_copyable < I, O > &&
std:: indirect_binary_predicate
< ranges:: equal_to , std :: projected < I, Proj > , const T * >
constexpr remove_copy_result < I, O >

remove_copy ( I first, S last, O result, const T & value, Proj proj = { } ) ;
(desde C++26)
(2)
template < ranges:: input_range R,

std:: weakly_incrementable O, class T, class Proj = std:: identity >
requires std:: indirectly_copyable < ranges:: iterator_t < R > , O > &&
std:: indirect_binary_predicate
< ranges:: equal_to ,
std :: projected < ranges:: iterator_t < R > , Proj > , const T * >
constexpr remove_copy_result < ranges:: borrowed_iterator_t < R > , O >

remove_copy ( R && r, O result, const T & value, Proj proj = { } ) ;
(desde C++20)
(hasta C++26)
template < ranges:: input_range R,

std:: weakly_incrementable O, class Proj = std:: identity ,
class T = std :: projected_value_t < ranges:: iterator_t < R > , Proj > >
requires std:: indirectly_copyable < ranges:: iterator_t < R > , O > &&
std:: indirect_binary_predicate
< ranges:: equal_to ,
std :: projected < ranges:: iterator_t < R > , Proj > , const T * >
constexpr remove_copy_result < ranges:: borrowed_iterator_t < R > , O >

remove_copy ( R && r, O result, const T & value, Proj proj = { } ) ;
(desde C++26)
template < std:: input_iterator I, std:: sentinel_for < I > S,

std:: weakly_incrementable O, class Proj = std:: identity ,
std:: indirect_unary_predicate < std :: projected < I, Proj >> Pred >
requires std:: indirectly_copyable < I, O >
constexpr remove_copy_if_result < I, O >

remove_copy_if ( I first, S last, O result, Pred pred, Proj proj = { } ) ;
(3) (desde C++20)
template < ranges:: input_range R,

std:: weakly_incrementable O, class Proj = std:: identity ,
std:: indirect_unary_predicate <
std :: projected < ranges:: iterator_t < R > , Proj >> Pred >
requires std:: indirectly_copyable < ranges:: iterator_t < R > , O >
constexpr remove_copy_if_result < ranges:: borrowed_iterator_t < R > , O >

remove_copy_if ( R && r, O result, Pred pred, Proj proj = { } ) ;
(4) (desde C++20)
Tipos auxiliares
template < class I, class O >
using remove_copy_result = ranges:: in_out_result < I, O > ;
(5) (desde C++20)
template < class I, class O >
using remove_copy_if_result = ranges:: in_out_result < I, O > ;
(6) (desde C++20)

Copia elementos del rango fuente [ first , last ) , al rango destino que comienza en result , omitiendo los elementos que (después de ser proyectados por proj ) satisfacen criterios específicos. El comportamiento es indefinido si los rangos fuente y destino se superponen.

1) Ignora todos los elementos que son iguales a value .
3) Ignora todos los elementos para los cuales el predicado pred devuelve true .
2,4) Igual que (1,3) , pero utiliza r como el rango fuente, como si usara ranges:: begin ( r ) como first , y ranges:: end ( r ) como last .

Las entidades similares a funciones descritas en esta página son algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

Parámetros

first, last - el par iterador-centinela que define el rango fuente de elementos a procesar
r - el rango fuente de elementos
result - el inicio del rango destino
value - el valor de los elementos no a copiar
comp - el predicado binario para comparar los elementos proyectados
proj - la proyección a aplicar a los elementos

Valor de retorno

{ last, result + N } , donde N es el número de elementos copiados.

Complejidad

Exactamente ranges:: distance ( first, last ) aplicaciones del predicado correspondiente comp y cualquier proyección proj .

Notas

El algoritmo es estable, es decir, preserva el orden relativo de los elementos copiados.

Macro de prueba de características Valor Std Característica
__cpp_lib_algorithm_default_value_type 202403 (C++26) Inicialización de lista para algoritmos ( 1,2 )

Implementación posible

remove_copy (1,2)
struct remove_copy_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S,
             std::weakly_incrementable O, class Proj = std::identity,
             class T = std::projected_value_t<I, Proj>>
    requires std::indirectly_copyable<I, O> &&
             std::indirect_binary_predicate<ranges::equal_to,
                                            std::projected<I, Proj>, const T*>
    constexpr ranges::remove_copy_result<I, O>
        operator()(I first, S last, O result, const T& value, Proj proj = {}) const
    {
        for (; !(first == last); ++first)
            if (value != std::invoke(proj, *first))
            {
                *result = *first;
                ++result;
            }
        return {std::move(first), std::move(result)};
    }
    template<ranges::input_range R, 
             std::weakly_incrementable O, class Proj = std::identity,
             class T = std::projected_value_t<ranges::iterator_t<R>, Proj>>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O> &&
             std::indirect_binary_predicate<ranges::equal_to,
             std::projected<ranges::iterator_t<R>, Proj>, const T*>
    constexpr ranges::remove_copy_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, O result, const T& value, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(result), value,
                       std::move(proj));
    }
};
inline constexpr remove_copy_fn remove_copy {};
remove_copy_if (3,4)
struct remove_copy_if_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O,
             class Proj = std::identity,
             std::indirect_unary_predicate<std::projected<I, Proj>> Pred>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::remove_copy_if_result<I, O>
        operator()(I first, S last, O result, Pred pred, Proj proj = {}) const
    {
        for (; first != last; ++first)
            if (false == std::invoke(pred, std::invoke(proj, *first)))
            {
                *result = *first;
                ++result;
            }
        return {std::move(first), std::move(result)};
    }
    template<ranges::input_range R, std::weakly_incrementable O,
             class Proj = std::identity,
             std::indirect_unary_predicate<
                 std::projected<ranges::iterator_t<R>, Proj>> Pred>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O>
    constexpr ranges::remove_copy_if_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, O result, Pred pred, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(result),
                       std::move(pred), std::move(proj));
    }
};
inline constexpr remove_copy_if_fn remove_copy_if {};

Ejemplo

#include <algorithm>
#include <array>
#include <complex>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <string_view>
#include <vector>
void println(const auto rem, const auto& v)
{
    std::cout << rem << ' ';
    for (const auto& e : v)
        std::cout << e << ' ';
    std::cout << '\n';
}
int main()
{
    // Filtrar el símbolo de almohadilla del texto dado.
    const std::string_view str{"#Small #Buffer #Optimization"};
    std::cout << "before: " << std::quoted(str) << '\n';
    std::cout << "after:  \"";
    std::ranges::remove_copy(str.begin(), str.end(),
                             std::ostream_iterator<char>(std::cout), '#');
    std::cout << "\"\n";
    // Copiar solo los números complejos con parte imaginaria positiva.
    using Ci = std::complex<int>;
    constexpr std::array<Ci, 5> source
    {
        Ci{1, 0}, Ci{0, 1}, Ci{2, -1}, Ci{3, 2}, Ci{4, -3}
    };
    std::vector<std::complex<int>> target;
    std::ranges::remove_copy_if
    (
        source,
        std::back_inserter(target),
        [](int imag) { return imag <= 0; },
        [](Ci z) { return z.imag(); }
    );
    println("source:", source);
    println("target:", target);
    std::vector<std::complex<float>> nums{{2, 2}, {1, 3}, {4, 8}, {1, 3}};
    std::vector<std::complex<double>> outs;
    #ifdef __cpp_lib_algorithm_default_value_type
        std::remove_copy(nums.cbegin(), nums.cend(), std::back_inserter(outs),
                         {1, 3}); // T se deduce como std::complex<float>
    #else
        std::remove_copy(nums.cbegin(), nums.cend(), std::back_inserter(outs),
                         std::complex<float>{1, 3});
    #endif
    println("nums:  ", nums);
    println("outs:  ", outs);
}

Salida:

before: "#Small #Buffer #Optimization"
after:  "Small Buffer Optimization"
source: (1,0) (0,1) (2,-1) (3,2) (4,-3)
target: (0,1) (3,2)
nums:   (2,2) (1,3) (4,8) (1,3)
outs:   (2,2) (4,8)

Véase también

elimina elementos que cumplen criterios específicos
(objeto función de algoritmo)
copia un rango de elementos a una nueva ubicación
(objeto función de algoritmo)
copia un número de elementos a una nueva ubicación
(objeto función de algoritmo)
copia un rango de elementos en orden inverso
(objeto función de algoritmo)
copia un rango, reemplazando elementos que cumplen criterios específicos con otro valor
(objeto función de algoritmo)
crea una copia de un rango que está invertido
(objeto función de algoritmo)
copia y rota un rango de elementos
(objeto función de algoritmo)
crea una copia de algún rango de elementos que no contiene duplicados consecutivos
(objeto función de algoritmo)
copia un rango de elementos omitiendo aquellos que cumplen criterios específicos
(plantilla de función)