Namespaces
Variants

std:: partition_copy

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
partition_copy
(C++11)
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
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 ) a dos rangos diferentes dependiendo del 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 con la policy .
Esta sobrecarga participa en la resolución de sobrecarga solo si se cumplen todas las siguientes condiciones:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true .

(hasta C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true .

(desde C++20)

Si * first no es escribible hacia 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 se superponen, el comportamiento es indefinido.

Contenidos

Parámetros

first, last - el par de iteradores que define el rango fuente de elementos a copiar
d_first_true - el inicio del rango de salida para los elementos que satisfacen p
d_first_false - el inicio 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 VT & , ni tampoco VT a menos que para VT un movimiento sea equivalente a una copia (desde C++11) . ​

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

Valor de retorno

Un std::pair construido desde el 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 uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.

Implementación posible

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 modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
P0896R4 C++11
C++17
1. el tipo de valor de InputIt (C++11)/ ForwardIt1 (C++17)
requería ser 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)
divide elementos en dos grupos preservando su orden relativo
(plantilla de función)
copia un rango de elementos a una nueva ubicación
(plantilla de función)
copia un rango de elementos omitiendo aquellos que cumplen criterios específicos
(plantilla de función)
copia un rango dividiendo los elementos en dos grupos
(objeto función de algoritmo)