std::forward_list<T,Allocator>:: merge
|
void
merge
(
forward_list
&
other
)
;
|
(1) |
(desde C++11)
(constexpr desde C++26) |
|
void
merge
(
forward_list
&&
other
)
;
|
(2) |
(desde C++11)
(constexpr desde C++26) |
|
template
<
class
Compare
>
void merge ( forward_list & other, Compare comp ) ; |
(3) |
(desde C++11)
(constexpr desde C++26) |
|
template
<
class
Compare
>
void merge ( forward_list && other, Compare comp ) ; |
(4) |
(desde C++11)
(constexpr desde C++26) |
Combina dos listas ordenadas en una lista ordenada.
- Si other se refiere al mismo objeto que * this , no hace nada.
- De lo contrario, transfiere todos los elementos de other a * this . other queda vacío después de la fusión.
Esta operación es estable:
- Para elementos equivalentes en las dos listas, los elementos de * this siempre preceden a los elementos de other .
- El orden de los elementos equivalentes de * this y other no cambia.
- * this o other no está ordenado con respecto al comparador comp .
- get_allocator ( ) == other. get_allocator ( ) es false .
No se invalidan iteradores ni referencias. Los punteros y referencias a los elementos movidos desde * this , así como los iteradores que se refieren a estos elementos, referirán a los mismos elementos de * this , en lugar de other .
Contenidos |
Parámetros
| other | - | otro contenedor a fusionar |
| 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 | ||
-
Compare
debe cumplir con los requisitos de
Compare
.
|
||
Excepciones
Si se lanza una excepción por cualquier razón, estas funciones no tienen efecto ( strong exception safety guarantee ). Excepto si la excepción proviene de una comparación.
Complejidad
Si other se refiere al mismo objeto que * this , no se realizan comparaciones.
De lo contrario, dado N 1 como std:: distance ( begin ( ) , end ( ) ) y N 2 como std:: distance ( other. begin ( ) , other. end ( ) ) :
Ejemplo
#include <iostream> #include <forward_list> std::ostream& operator<<(std::ostream& ostr, const std::forward_list<int>& list) { for (const int i : list) ostr << ' ' << i; return ostr; } int main() { std::forward_list<int> list1 = {5, 9, 1, 3, 3}; std::forward_list<int> list2 = {8, 7, 2, 3, 4, 4}; list1.sort(); list2.sort(); std::cout << "list1: " << list1 << '\n'; std::cout << "list2: " << list2 << '\n'; list1.merge(list2); std::cout << "merged:" << list1 << '\n'; }
Salida:
list1: 1 3 3 5 9 list2: 2 3 4 4 7 8 merged: 1 2 3 3 3 4 4 5 7 8 9
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2045 | C++11 |
No se podía garantizar O(1) en movimiento de nodos si
get_allocator ( ) ! = other. get_allocator ( ) |
el comportamiento es
indefinido en este caso |
| LWG 3088 | C++11 |
el efecto cuando
*
this
y
other
refieren
al mismo objeto no estaba especificado operator < podría comportarse incorrectamente para elementos puntero |
especificado como no-operación
definido por la implementación se utiliza orden total estricto |
Véase también
transfiere elementos desde otro
forward_list
(función miembro pública) |
|
|
fusiona dos rangos ordenados
(plantilla de función) |
|
|
fusiona dos rangos ordenados in situ
(plantilla de función) |
|
|
(C++20)
|
fusiona dos rangos ordenados
(objeto función de algoritmo) |
|
(C++20)
|
fusiona dos rangos ordenados in situ
(objeto función de algoritmo) |