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,
|
(2) | (desde C++17) |
|
template
<
class
BidirIt,
class
Compare
>
void
inplace_merge
(
BidirIt first, BidirIt middle, BidirIt last,
|
(3) | (constexpr desde C++26) |
|
template
<
class
ExecutionPolicy,
class
BidirIt,
class
Compare
>
void
inplace_merge
(
ExecutionPolicy
&&
policy,
|
(4) | (desde C++17) |
Combina dos rangos ordenados consecutivos
[
first
,
middle
)
y
[
middle
,
last
)
en un único 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.
|
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:
-
[first,middle)o[middle,last)no es un rango válido .
|
(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)
|
| 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 ) :
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
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) |
|
|
(C++20)
|
combina dos rangos ordenados in situ
(objeto función de algoritmo) |