std::list::merge
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) |
[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) | |
Fusiona dos rangos ordenados. (plantilla de función) | |
Fusiona dos rangos ordenados in situ. (plantilla de función) | |
(C++20) |
Fusiona dos rangos ordenados (niebloid) |
(C++20) |
Fusiona dos rangos ordenados in situ. (niebloid) |