Namespaces
Variants

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

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

Transfère les éléments de other vers * this . Les éléments sont insérés à la position pos .

Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :

  • pos n'est pas dans l'intervalle [ begin ( ) , end ( ) ) .
  • get_allocator ( ) == other. get_allocator ( ) est false .
1,2) Transfère tous les éléments de other . other devient vide après l'opération.
Si * this et other font référence au même objet, le comportement est indéfini.
3,4) Transfère l'élément pointé par it .
* this et other peuvent faire référence au même objet. Dans ce cas, il n'y a aucun effet si pos == it ou pos == ++ it est true .
Si it n'est pas dans l'intervalle [ begin ( ) , end ( ) ) , le comportement est indéfini.
5,6) Transfère les éléments dans la plage [ first , last ) .
* this et other peuvent faire référence au même objet.
Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :
  • [ first , last ) n'est pas une plage valide dans other ,
  • Tout itérateur dans [ first , last ) n'est pas déréférençable.
  • pos se trouve dans [ first , last ) .

Aucun itérateur ou référence n'est invalidé. Si * this et other font référence à des objets différents, les itérateurs pointant vers les éléments transférés se réfèrent désormais à * this , et non à other .

Table des matières

Paramètres

pos - élément avant lequel le contenu sera inséré
other - autre conteneur depuis lequel transférer le contenu
it - élément à transférer de other vers * this
first, last - paire d'itérateurs définissant la plage d'éléments à transférer de other vers * this

Complexité

1-4) Constant.
5,6) Constant si other fait référence au même objet que * this , sinon linéaire en std:: distance ( first, last ) .

Exemple

#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';
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement correct
LWG 250 C++98 les références et itérateurs vers l'élément
déplacé étaient tous invalidés
ils se réfèrent ou pointent vers le(s)
même(s) élément(s) dans * this
N2525 C++98 le splicing en O(1) ne pouvait être garanti si
get_allocator ( ) ! = other. get_allocator ( )
le comportement est
indéfini dans ce cas

Voir aussi

fusionne deux listes triées
(fonction membre publique)
supprime les éléments satisfaisant des critères spécifiques
(fonction membre publique)