std::inplace_merge
| Definido en el encabezado <algorithm>
|
||
template< class BidirIt >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last );
|
(1) | (constexpr desde C++26) |
template< class ExecutionPolicy, class BidirIt >
void inplace_merge( ExecutionPolicy&& policy,
BidirIt first, BidirIt middle, BidirIt last );
|
(2) | (desde C++17) |
template< class BidirIt, class Compare >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last,
Compare comp );
|
(3) | (constexpr desde C++26) |
template< class ExecutionPolicy, class BidirIt, class Compare >
void inplace_merge( ExecutionPolicy&& policy,
BidirIt first, BidirIt middle, BidirIt last,
Compare comp );
|
(4) | (desde C++17) |
Fusiona dos rangos ordenados consecutivos [first, middle) y [middle, last) en un rango ordenado [first, last).
[first, middle) o [middle, last) no está ordenado con respecto a operator<(hasta C++20)std::less{}(desde C++20), el comportamiento es indefinido.[first, middle) o [middle, last) no está ordenado con respecto a comp, el comportamiento es indefinido.policy.true:
|
|
(hasta C++20) |
|
|
(desde C++20) |
Esta función de fusión es estable, lo que significa que para elementos equivalentes en los dos rangos originales, los elementos del primer rango (preservando su orden original) preceden a los elementos del segundo rango (preservando su orden original).
Si se cumple alguna de las siguientes condiciones, el comportamiento es indefinido:
[first,middle)o[middle,last)no es un rango válido.
|
(hasta C++11) |
|
(desde C++11) |
Parámetros
| first | - | el comienzo del primer rango ordenado |
| middle | - | el final del primer rango ordenado y el comienzo del segundo |
| last | - | el final del segundo rango ordenado |
| 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 firma de la función de comparación debe ser equivalente a la siguiente:
Si bien la firma no necesita tener |
| Requisitos de tipo | ||
-BidirIt debe cumplir los requisitos de LegacyBidirectionalIterator.
| ||
-Compare debe cumplir los requisitos de Compare.
| ||
Complejidad
Dado N como std::distance(first, last):
operator<(hasta C++20)std::less{}(desde C++20) si hay suficiente memoria adicional disponible, O(N⋅log(N)) comparaciones en caso contrario.operator<(hasta C++20)std::less{}(desde C++20).comp si hay suficiente memoria adicional disponible, O(N⋅log(N)) aplicaciones en caso contrario.comp.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 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 no puede asignar memoria, se lanza std::bad_alloc.
Posible implementación
Véanse las implementaciones en libstdc++ y libc++.
Notas
Esta función intenta asignar un búfer temporal. Si la asignación falla, se elige el algoritmo menos eficiente.
| Macro de prueba de funcionalidad | Valor | Std | Funcionalidad |
|---|---|---|---|
__cpp_lib_constexpr_algorithms |
202306L |
(C++26) | constexpr fusión in situ (1), (3)
|
Ejemplo
El siguiente código es una implementación de ordenamiento por fusión.
#include <algorithm>
#include <iostream>
#include <vector>
template<class Iter>
void merge_sort(Iter first, Iter last)
{
if (last - first > 1)
{
Iter middle = first + (last - first) / 2;
merge_sort(first, middle);
merge_sort(middle, last);
std::inplace_merge(first, middle, last);
}
}
int main()
{
std::vector<int> v{8, 2, -2, 0, 11, 11, 1, 7, 3};
merge_sort(v.begin(), v.end());
for (const auto& n : v)
std::cout << n << ' ';
std::cout << '\n';
}
Salida:
-2 0 1 2 3 7 8 11 11
Véase también
| fusiona dos rangos ordenados (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
| ordena un rango de elementos (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
| ordena un rango de elementos preservando el orden relativo entre elementos equivalentes (plantilla de función & objeto de función de algoritmo) | |
(C++20) |
|
(C++20) |
fusiona dos rangos ordenados in situ (objeto de función de algoritmo) |