std:: nth_element
|
Definido en el encabezado
<algorithm>
|
||
|
template
<
class
RandomIt
>
void nth_element ( RandomIt first, RandomIt nth, RandomIt last ) ; |
(1) | (constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
RandomIt
>
void
nth_element
(
ExecutionPolicy
&&
policy,
|
(2) | (desde C++17) |
|
template
<
class
RandomIt,
class
Compare
>
void
nth_element
(
RandomIt first, RandomIt nth, RandomIt last,
|
(3) | (constexpr desde C++20) |
|
template
<
class
ExecutionPolicy,
class
RandomIt,
class
Compare
>
void
nth_element
(
ExecutionPolicy
&&
policy,
|
(4) | (desde C++17) |
nth_element
reorganiza los elementos en
[
first
,
last
)
de modo que después de la reorganización:
-
El elemento apuntado por
nth
se cambia al elemento que ocurriría en esa posición si
[first,last)estuviera ordenado. -
Para cada iterador
i
en
[first,nth)y cada iterador j en[nth,last), se cumple la siguiente condición:
|
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 se satisface cualquiera de las siguientes condiciones, el comportamiento es indefinido:
-
[first,nth)o[nth,last)no es un rango válido .
|
(hasta C++11) |
|
(desde C++11) |
Contenidos |
Parámetros
| first, last | - | el par de iteradores que define el rango de elementos para el ordenamiento parcial |
| nth | - | iterador de acceso aleatorio que define el punto de partición del ordenamiento |
| 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
de) el segundo.
La signatura de la función de comparación debe ser equivalente a lo siguiente: bool cmp ( const Type1 & a, const Type2 & b ) ;
Aunque la signatura no necesita tener
const
&
, la función no debe modificar los objetos pasados a ella y debe poder aceptar todos los valores de tipo (posiblemente const)
|
| Requisitos de tipo | ||
-
RandomIt
debe cumplir con los requisitos de
LegacyRandomAccessIterator
.
|
||
-
Compare
debe cumplir con los requisitos de
Compare
.
|
||
Complejidad
Dado N como last - first :
Excepciones
Las sobrecargas con un parámetro de plantilla llamado
ExecutionPolicy
reportan errores de la siguiente manera:
-
Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.
Implementación posible
Consulte también las implementaciones en libstdc++ , libc++ , y MSVC STL .
Notas
El algoritmo utilizado es típicamente Introselect aunque se permiten otros Selection algorithm con complejidad promedio adecuada.
Ejemplo
#include <algorithm> #include <cassert> #include <functional> #include <iostream> #include <numeric> #include <vector> void printVec(const std::vector<int>& vec) { std::cout << "v = {"; for (char sep[]{0, ' ', 0}; const int i : vec) std::cout << sep << i, sep[0] = ','; std::cout << "};\n"; } int main() { std::vector<int> v{5, 10, 6, 4, 3, 2, 6, 7, 9, 3}; printVec(v); auto m = v.begin() + v.size() / 2; std::nth_element(v.begin(), m, v.end()); std::cout << "\nThe median is " << v[v.size() / 2] << '\n'; // Consecuencia de la desigualdad de elementos antes/después del enésimo: assert(std::accumulate(v.begin(), m, 0) < std::accumulate(m, v.end(), 0)); printVec(v); // Nota: función de comparación modificada std::nth_element(v.begin(), v.begin() + 1, v.end(), std::greater{}); std::cout << "\nThe second largest element is " << v[1] << '\n'; std::cout << "The largest element is " << v[0] << '\n'; printVec(v); }
Salida posible:
v = {5, 10, 6, 4, 3, 2, 6, 7, 9, 3};
The median is 6
v = {3, 2, 3, 4, 5, 6, 10, 7, 9, 6};
The second largest element is 9
The largest element is 10
v = {10, 9, 6, 7, 6, 3, 5, 4, 3, 2};
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2150 | C++98 |
después del reordenamiento, solo se requería que un elemento antes de
nth
no fuera mayor que un elemento después de nth |
se corrigió el
requisito |
| LWG 2163 | C++98 | la sobrecarga ( 1 ) utilizaba operator > para comparar los elementos | se cambió a operator < |
| P0896R4 | C++98 |
[
first
,
nth
)
y
[
nth
,
last
)
no se requería que fueran rangos válidos |
el comportamiento es indefinido
si alguno de ellos es inválido |
Véase también
|
devuelve el elemento más grande en un rango
(plantilla de función) |
|
|
devuelve el elemento más pequeño en un rango
(plantilla de función) |
|
|
copia y ordena parcialmente un rango de elementos
(plantilla de función) |
|
|
ordena un rango de elementos preservando el orden entre elementos iguales
(plantilla de función) |
|
|
ordena un rango en orden ascendente
(plantilla de función) |
|
|
(C++20)
|
ordena parcialmente el rango dado asegurando que está particionado por el elemento especificado
(objeto función de algoritmo) |