Espacios de nombres
Variantes
Acciones

std::list::merge

De cppreference.com
< cpp‎ | container‎ | list
 
 
 
 
void merge( list& other );
(1)
void merge( list&& other );
(1) (desde C++11)
template <class Compare>
void merge( list& other, Compare comp );
(2)
template <class Compare>
void merge( list&& other, Compare comp );
(2) (desde C++11)

Fusiona dos listas ordenadas en una. Las listas deben ordenarse en orden ascendente.

No se copian elementos. El contenedor other queda vacío después de la operación. La función no hace nada si other se refiere al mismo objeto que *this. Si get_allocator() != Other.get_allocator(), el comportamiento no está definido. Ningún iterador o referencia se invalida, excepto que los iteradores de elementos movidos ahora se refieren a *this, no a other. La primera versión usa operator< para comparar los elementos, la segunda versión usa la función de comparación dada comp.

Esta operación es estable: para elementos equivalentes en las dos listas, los elementos de * this siempre precederán a los elementos de other, y el orden de los elementos equivalentes de * this y other no cambia.

Contenido

[editar] Parámetros

other - El 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 (es decir, se ordena antes) que el segundo.

La signatura de la función de comparación debe ser equivalente a la siguiente:

 bool cmp(const Tipo1 &a, const Tipo2 &b);

Si bien la signatura no necesita tener const &, la función no debe modificar los objetos que se le pasan y debe poder aceptar todos los valores de tipo (posiblemente const) Tipo1 y Tipo2 independientemente de la categoría de valor (por lo tanto, Tipo1 & no está permitido , ni Tipo1 a menos que para Tipo1 un movimiento sea equivalente a una copia (desde C++11)).
Los tipos Tipo1 y Tipo2 deben ser tales que un objeto de tipo list<T,Allocator>::const_iterator puede ser desreferenciado y luego convertido implícitamente a ambos. ​

[editar] Valor de retorno

(Ninguno)

[editar] Excepciones

Si se lanza una excepción, esta función no tiene ningún efecto (garantía de excepción fuerte), excepto si la excepción proviene de la función de comparación.

[editar] Complejidad

A lo sumo std::distance(begin(), end()) + std::distance(other.begin(), other.end()) - 1 comparaciones.

[editar] Ejemplo

#include <iostream>
#include <list>
 
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
    for (const auto &i : list) {
        ostr << ' ' << i;
    }
    return ostr;
}
 
int main()
{
    std::list<int> lista1 = {5, 9, 1, 3, 3};
    std::list<int> lista2 = {8, 7, 2, 3, 4, 4};
 
    lista1.sort();
    lista2.sort();
    std::cout << "lista1:      " << lista1 << '\n';
    std::cout << "lista2:      " << lista2 << '\n';
    lista1.merge(lista2);
    std::cout << "fusionadas:  " << lista1 << '\n';
}

Salida:

lista1:      1 3 3 5 9
lista2:      2 3 4 4 7 8
fusionadas:  1 2 3 3 3 4 4 5 7 8 9

[editar] Véase también

Mueve elementos de otro contenedor list.
(función miembro pública) [editar]
Fusiona dos rangos ordenados.
(plantilla de función) [editar]
Fusiona dos rangos ordenados in situ.
(plantilla de función) [editar]
Fusiona dos rangos ordenados
(niebloid) [editar]
Fusiona dos rangos ordenados in situ.
(niebloid) [editar]