Namespaces
Variants

std:: inplace_merge

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
inplace_merge
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
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)

Combina dos rangos ordenados consecutivos [ first , middle ) y [ middle , last ) en un único 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 con la policy .
Estas sobrecargas participan en la resolución de sobrecarga solo si se satisfacen todas las siguientes condiciones:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true .

(until C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true .

(since 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 satisface cualquiera de las siguientes condiciones, el comportamiento es indefinido:

(hasta C++11)
(desde C++11)

Contenidos

Parámetros

first - el inicio del primer rango ordenado
middle - el final del primer rango ordenado y el inicio 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 ) ;

Aunque la firma 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) Type1 y Type2 independientemente de la categoría de valor (por lo tanto, Type1& no está permitido , ni tampoco 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 con los requisitos de LegacyBidirectionalIterator .
-
Compare debe cumplir con los requisitos de Compare .

Complejidad

Dado N como std:: distance ( first, last ) :

1) Exactamente N-1 comparaciones usando operator < (until C++20) std:: less { } (since 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 uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.

Implementación posible

Vea 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 características Valor Estándar Característica
__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 mezcla.

#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

combina dos rangos ordenados
(plantilla de función)
ordena un rango en orden ascendente
(plantilla de función)
ordena un rango de elementos preservando el orden entre elementos iguales
(plantilla de función)
combina dos rangos ordenados in situ
(objeto función de algoritmo)