std::partial_sort_copy
| Definido en el encabezado <algorithm>
|
||
template< class InputIt, class RandomIt >
RandomIt partial_sort_copy( InputIt first, InputIt last,
RandomIt d_first, RandomIt d_last );
|
(1) | (constexpr desde C++20) |
template< class ExecutionPolicy,
class ForwardIt, class RandomIt >
RandomIt partial_sort_copy( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last,
RandomIt d_first, RandomIt d_last );
|
(2) | (desde C++17) |
template< class InputIt, class RandomIt, class Compare >
RandomIt partial_sort_copy( InputIt first, InputIt last,
RandomIt d_first, RandomIt d_last,
Compare comp );
|
(3) | (constexpr desde C++20) |
template< class ExecutionPolicy,
class ForwardIt, class RandomIt, class Compare >
RandomIt partial_sort_copy( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last,
RandomIt d_first, RandomIt d_last,
Compare comp );
|
(4) | (desde C++17) |
Ordena algunos de los elementos del rango [first, last) en orden ascendente, almacenando el resultado en el rango [d_first, d_last).
Como máximo d_last - d_first de los elementos se colocan ordenados en el rango [d_first, d_first + n). n es el número de elementos a ordenar (std::min(std::distance(first, last), d_last - d_first)). No se garantiza que se preserve el orden de los elementos iguales.
comp.policy.true:
|
|
(hasta C++20) |
|
|
(desde C++20) |
Si *first no es escribible en d_first, el programa está mal formado.
Si se cumple alguna de las siguientes condiciones, el comportamiento no está definido:
|
(hasta C++11) |
|
(desde C++11) |
Parámetros
| first, last | - | el par de iteradores que define el rango de elementos a ordenar |
| d_first, d_last | - | el par de iteradores que define el rango de destino al que se asignarán los datos ordenados |
| policy | - | la política de ejecución a utilizar |
| comp | - | objeto función de comparación (es decir, un objeto que satisface los requisitos de Compare) que devuelve true si el primer argumento es menor que (es decir, está ordenado antes) que el segundo. La signatura de la función de comparación debe ser equivalente a la siguiente:
Si bien la signatura no necesita tener |
| Requisitos de tipo | ||
-InputIt debe cumplir los requisitos de LegacyInputIterator.
| ||
-ForwardIt debe cumplir los requisitos de LegacyForwardIterator.
| ||
-RandomIt debe cumplir los requisitos de LegacyRandomAccessIterator.
| ||
-Compare debe cumplir los requisitos de Compare.
| ||
Valor de retorno
Un iterador al elemento que define el límite superior del rango ordenado, es decir d_first + std::min(std::distance(first, last), d_last - d_first).
Complejidad
Dado N como std::distance(first, last), D como d_last - d_first:
operator<(hasta C++20)std::less{}(desde C++20).comp.Excepciones
Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy informan 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
Véase también las implementaciones en libstdc++ y libc++.
Ejemplo
El siguiente código ordena un vector de enteros y los copia en un vector más pequeño y otro más grande.
#include <algorithm>
#include <functional>
#include <iostream>
#include <string_view>
#include <type_traits>
#include <vector>
void println(std::string_view rem, const auto& v)
{
std::cout << rem;
if constexpr (std::is_scalar_v<std::decay_t<decltype(v)>>)
std::cout << v;
else
for (int e : v)
std::cout << e << ' ';
std::cout << '\n';
}
int main()
{
const auto v0 = {4, 2, 5, 1, 3};
std::vector<int> v1{10, 11, 12};
std::vector<int> v2{10, 11, 12, 13, 14, 15, 16};
std::vector<int>::iterator it;
it = std::partial_sort_copy(v0.begin(), v0.end(), v1.begin(), v1.end());
println("Writing to the smaller vector in ascending order gives: ", v1);
if (it == v1.end())
println("The return value is the end iterator", ' ');
it = std::partial_sort_copy(v0.begin(), v0.end(), v2.begin(), v2.end(),
std::greater<int>());
println("Writing to the larger vector in descending order gives: ", v2);
println("The return value is the iterator to ", *it);
}
Salida:
Writing to the smaller vector in ascending order gives: 1 2 3
The return value is the end iterator
Writing to the larger vector in descending order gives: 5 4 3 2 1 15 16
The return value is the iterator to 15
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 publicado | Comportamiento correcto |
|---|---|---|---|
| P0896R4 | C++98 | *first no se requería que fuera escribible en d_first
|
el programa está mal formado si no es escribible |
Véase también
| ordena los primeros N elementos de un rango (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| ordena un rango de elementos (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
| ordena un rango de elementos preservando el orden relativo entre elementos equivalentes (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++20) |
copia y ordena parcialmente un rango de elementos (objeto función de algoritmo) |