Namespaces
Variants

std::partition_copy

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones que cambian el orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenación y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de mezcla (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Definido en el encabezado <algorithm>
template< class InputIt, class OutputIt1,
          class OutputIt2, class UnaryPred >
std::pair<OutputIt1, OutputIt2>
    partition_copy( InputIt first, InputIt last,
                    OutputIt1 d_first_true, OutputIt2 d_first_false,
                    UnaryPred p );
(1) (desde C++11)
(constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
          class ForwardIt3, class UnaryPred >
std::pair<ForwardIt2, ForwardIt3>
    partition_copy( ExecutionPolicy&& policy,
                    ForwardIt1 first, ForwardIt1 last,
                    ForwardIt2 d_first_true, ForwardIt3 d_first_false,
                    UnaryPred p );
(2) (desde C++17)
1) Copia los elementos del rango [first, last) en dos rangos diferentes según el valor devuelto por el predicado p.
  • Los elementos que satisfacen el predicado p se copian al rango que comienza en d_first_true.
  • El resto de los elementos se copian al rango que comienza en d_first_false.
2) Igual que (1), pero ejecutado de acuerdo a policy.
Esta sobrecarga participa en la resolución de sobrecargas solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(desde C++20)

Si *first no es escribible en d_first_true o d_first_false, el programa está mal formado.

Entre el rango de entrada y los dos rangos de salida, si dos rangos cualesquiera se superponen, el comportamiento no está definido.

Parámetros

first, last - el par de iteradores que definen el rango fuente de elementos a copiar
d_first_true - el comienzo del rango de salida para los elementos que satisfacen p
d_first_false - el comienzo del rango de salida para los elementos que no satisfacen p
policy - la política de ejecución a utilizar
p - predicado unario que retorna ​true si el elemento debe colocarse en d_first_true.

La expresión p(v) debe ser convertible a bool para cada argumento v de tipo (posiblemente const) VT, donde VT es el tipo de valor de InputIt, independientemente de la categoría de valor, y no debe modificar v. Por lo tanto, no se permite un tipo de parámetro de VT&, ni VT a menos que para VT un movimiento equivalga a una copia(desde C++11). ​

Requisitos de tipo
-
InputIt debe cumplir los requisitos de LegacyInputIterator.
-
OutputIt1, OutputIt2 deben cumplir los requisitos de LegacyOutputIterator.
-
ForwardIt1, ForwardIt2, ForwardIt3 deben cumplir los requisitos de LegacyForwardIterator.
-
UnaryPred debe cumplir los requisitos de Predicate.

Valor de retorno

Un std::pair construido a partir del iterador al final del rango d_first_true y el iterador al final del rango d_first_false.

Complejidad

Exactamente std::distance(first, last) aplicaciones de p.

Para la sobrecarga (2), puede haber un costo de rendimiento si el tipo de valor de ForwardIt no es CopyConstructible.

Excepciones

La sobrecarga con un parámetro de plantilla llamado ExecutionPolicy reporta errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es una de las políticas estándar, se llama a std::terminate. Para cualquier otro ExecutionPolicy, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

Posible implementación

partition_copy (1)
template<class InputIt, class OutputIt1,
         class OutputIt2, class UnaryPred>
constexpr //< since C++20
std::pair<OutputIt1, OutputIt2>
    partition_copy(InputIt first, InputIt last,
                   OutputIt1 d_first_true, OutputIt2 d_first_false,
                   UnaryPred p)
{
    for (; first != last; ++first)
    {
        if (p(*first))
        {
            *d_first_true = *first;
            ++d_first_true;
        }
        else
        {
            *d_first_false = *first;
            ++d_first_false;
        }
    }
    
    return std::pair<OutputIt1, OutputIt2>(d_first_true, d_first_false);
}

Ejemplo

#include <algorithm>
#include <iostream>
#include <utility>

void print(auto rem, const auto& v)
{
    for (std::cout << rem; const auto& x : v)
        std::cout << x << ' ';
    std::cout << '\n';
}

int main()
{
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int true_arr[5] = {0};
    int false_arr[5] = {0};
    
    std::partition_copy(std::begin(arr), std::end(arr),
                        std::begin(true_arr), std::begin(false_arr),
                        [](int i) { return 4 < i; });
    
    print("true_arr:  ", true_arr);
    print("false_arr: ", false_arr);
}

Salida:

true_arr:  5 6 7 8 9
false_arr: 0 1 2 3 4

Informes de defectos

Los siguientes informes de defectos que cambian el comportamiento se aplicaron retroactivamente a los estándares C++ previamente publicados.

DR Aplicado a Comportamiento como se publicó Comportamiento correcto
P0896R4 C++11
C++17
1. se requería que el tipo de valor de InputIt (C++11)/ForwardIt1 (C++17)
     fuera CopyAssignable
2. los dos rangos de salida podían superponerse
1. no requerido
2. el comportamiento es
    indefinido en este caso

Véase también

divide un rango de elementos en dos grupos
(plantilla de función & objeto función de algoritmo)
divide los elementos en dos grupos conservando su orden relativo dentro de cada grupo
(plantilla de función & objeto función de algoritmo)
copia un rango de elementos a una nueva ubicación
(plantilla de función & objeto función de algoritmo)
copia un rango de elementos omitiendo aquellos que satisfacen criterios específicos
(plantilla de función & objeto función de algoritmo)
copia un rango dividiendo los elementos en dos grupos
(objeto función de algoritmo)