std::partition_copy
| 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) |
[first, last) en dos rangos diferentes según el valor devuelto por el predicado p.
- Los elementos que satisfacen el predicado
pse copian al rango que comienza end_first_true. - El resto de los elementos se copian al rango que comienza en
d_first_false.
policy.true:
|
|
(hasta C++20) |
|
|
(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 |
| 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
ExecutionPolicyes una de las políticas estándar, se llama a std::terminate. Para cualquier otroExecutionPolicy, 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) | |
(C++20) |
|
| divide los elementos en dos grupos conservando su orden relativo dentro de cada grupo (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++11) |
copia un rango de elementos a una nueva ubicación (plantilla de función & objeto función de algoritmo) |
(C++20)(C++20) |
|
| copia un rango de elementos omitiendo aquellos que satisfacen criterios específicos (plantilla de función & objeto función de algoritmo) | |
(C++20)(C++20) |
|
(C++20) |
copia un rango dividiendo los elementos en dos grupos (objeto función de algoritmo) |