Namespaces
Variants

std::inplace_merge

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p.ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Operaciones de ordenamiento y relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
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).

1) Si [first, middle) o [middle, last) no está ordenado con respecto a operator<(hasta C++20)std::less{}(desde C++20), el comportamiento es indefinido.
3) Si [first, middle) o [middle, last) no está ordenado con respecto a comp, el comportamiento es indefinido.
2,4) Igual que (1,3), pero ejecutado de acuerdo a policy.
Estas sobrecargas participan en la resolución de sobrecargas solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(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:

(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:

bool cmp(const Type1& a, const Type2& b);

Si bien la firma no necesita tener const&, la función no debe modificar los objetos que se le pasan y debe ser capaz de aceptar todos los valores de tipo (posiblemente const) Type1 y Type2 independientemente de la categoría de valor (por lo tanto, Type1& no está permitido, ni Type1 a menos que para Type1 un movimiento sea equivalente a una copia(desde C++11)).
Los tipos Type1 y Type2 deben ser tales que un objeto de tipo BidirIt pueda ser desreferenciado y luego convertido implícitamente a ambos. ​

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):

1) Exactamente N-1 comparaciones usando operator<(hasta C++20)std::less{}(desde C++20) si hay suficiente memoria adicional disponible, O(N⋅log(N)) comparaciones en caso contrario.
2) O(N⋅log(N)) comparaciones usando operator<(hasta C++20)std::less{}(desde C++20).
3) Exactamente N-1 aplicaciones de la función de comparación comp si hay suficiente memoria adicional disponible, O(N⋅log(N)) aplicaciones en caso contrario.
4) O(N⋅log(N)) aplicaciones de la función de comparación 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 ExecutionPolicy es una de las políticas estándar, se llama a std::terminate. Para cualquier otro ExecutionPolicy, 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)
ordena un rango de elementos
(plantilla de función & objeto de función de algoritmo)
ordena un rango de elementos preservando el orden relativo entre elementos equivalentes
(plantilla de función & objeto de función de algoritmo)
fusiona dos rangos ordenados in situ
(objeto de función de algoritmo)