Namespaces
Variants

std::list<T,Allocator>:: splice

From cppreference.net
void splice ( const_iterator pos, list & other ) ;
(1) (constexpr desde C++26)
void splice ( const_iterator pos, list && other ) ;
(2) (desde C++11)
(constexpr desde C++26)
void splice ( const_iterator pos, list & other, const_iterator it ) ;
(3) (constexpr desde C++26)
void splice ( const_iterator pos, list && other, const_iterator it ) ;
(4) (desde C++11)
(constexpr desde C++26)
void splice ( const_iterator pos, list & other,
const_iterator first, const_iterator last ) ;
(5) (constexpr desde C++26)
void splice ( const_iterator pos, list && other,
const_iterator first, const_iterator last ) ;
(6) (desde C++11)
(constexpr desde C++26)

Transfiere elementos de other a * this . Los elementos se insertan en pos .

Si se satisface cualquiera de las siguientes condiciones, el comportamiento es indefinido:

  • pos no está en el rango [ begin ( ) , end ( ) ) .
  • get_allocator ( ) == other. get_allocator ( ) es false .
1,2) Transfiere todos los elementos de other . other queda vacío después de la operación.
Si * this y other se refieren al mismo objeto, el comportamiento es indefinido.
3,4) Transfiere el elemento apuntado por it .
* this y other pueden referirse al mismo objeto. En este caso, no hay efecto si pos == it o pos == ++ it es true .
Si it no está en el rango [ begin ( ) , end ( ) ) , el comportamiento es indefinido.
5,6) Transfiere elementos en el rango [ first , last ) .
* this y other pueden referirse al mismo objeto.
Si se satisface cualquiera de las siguientes condiciones, el comportamiento es indefinido:
  • [ first , last ) no es un rango válido en other ,
  • Cualquier iterador en [ first , last ) no es desreferenciable.
  • pos está en [ first , last ) .

No se invalidan iteradores ni referencias. Si * this y other hacen referencia a objetos diferentes, los iteradores de los elementos transferidos ahora hacen referencia a * this , no a other .

Contenidos

Parámetros

pos - elemento antes del cual se insertará el contenido
other - otro contenedor desde el cual transferir el contenido
it - el elemento a transferir desde other a * this
first, last - el par de iteradores que define el rango de elementos a transferir desde other a * this

Complejidad

1-4) Constante.
5,6) Constante si other se refiere al mismo objeto que * this , de lo contrario lineal en std:: distance ( first, last ) .

Ejemplo

#include <iostream>
#include <list>
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
    for (auto& i : list)
        ostr << ' ' << i;
    return ostr;
}
int main ()
{
    std::list<int> list1{1, 2, 3, 4, 5};
    std::list<int> list2{10, 20, 30, 40, 50};
    auto it = list1.begin();
    std::advance(it, 2);
    list1.splice(it, list2);
    std::cout << "list1:" << list1 << '\n';
    std::cout << "list2:" << list2 << '\n';
    list2.splice(list2.begin(), list1, it, list1.end());
    std::cout << "list1:" << list1 << '\n';
    std::cout << "list2:" << list2 << '\n';
}

Salida:

list1: 1 2 10 20 30 40 50 3 4 5
list2:
list1: 1 2 10 20 30 40 50
list2: 3 4 5

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 250 C++98 las referencias e iteradores al elemento(s)
movido(s) eran todos invalidados
se refieren o apuntan al
mismo elemento(s) en * this
N2525 C++98 no se podía garantizar el empalme O(1) si
get_allocator ( ) ! = other. get_allocator ( )
el comportamiento es
indefinido en este caso

Véase también

fusiona dos listas ordenadas
(función miembro pública)
elimina elementos que cumplen criterios específicos
(función miembro pública)