std::list::splice în C++

splice() mută noduri dintr-o listă în alta fără copiere; merge() interclasează două liste sortate.

Sintaxă
void splice(const_iterator poz, list& alta);
void splice(const_iterator poz, list& alta, const_iterator element);
void splice(const_iterator poz, list& alta, const_iterator prim, const_iterator ultim);

void merge(list& alta);
void merge(list& alta, Compare comparator);

Ce face std::list::splice

splice taie elemente din lista alta și le lipește în lista curentă, înaintea poziției poz. Poți muta toată lista, un singur element sau un interval. Nu se copiază și nu se alocă nimic: se schimbă doar legăturile, iar iteratorii spre elementele mutate rămân valizi (acum arată în lista nouă).

merge presupune că ambele liste sunt deja sortate. Mută toate elementele din alta în lista curentă, păstrând ordinea sortată. După apel, alta este goală.

Parametri

Parametru Descriere
poz Poziția din lista curentă înaintea căreia se pun elementele.
alta Lista din care se mută elementele (poate fi chiar lista curentă, pentru mutări interne).
element / prim, ultim Elementul sau intervalul mutat.
comparator Pentru merge: aceeași ordine după care sunt sortate listele.

Ce returnează

Nimic (void).

Exemple

Exemplul 1: Mutarea elementelor între liste

#include <list>
#include <print>
#include <string>

int main() {
    std::list<std::string> vip{"Ana", "Ion"};
    std::list<std::string> normal{"Maria", "Dan", "Elena"};

    auto dan = std::next(normal.begin());          // "Dan"
    vip.splice(vip.end(), normal, dan);            // mutăm doar pe Dan
    std::println("vip: {}  normal: {}", vip, normal);

    vip.splice(vip.begin(), normal);               // mutăm tot restul, la început
    std::println("vip: {}  normal: {}", vip, normal);
    std::println("Iteratorul dan arată tot spre: {}", *dan);
}

Rezultat

vip: ["Ana", "Ion", "Dan"]  normal: ["Maria", "Elena"]
vip: ["Maria", "Elena", "Ana", "Ion", "Dan"]  normal: []
Iteratorul dan arată tot spre: Dan

Exemplul 2: Interclasarea a două liste sortate

#include <list>
#include <print>

int main() {
    std::list<int> a{1, 4, 9};
    std::list<int> b{2, 3, 10};
    a.merge(b);
    std::println("a = {}, b = {} (goală)", a, b);
}

Rezultat

a = [1, 2, 3, 4, 9, 10], b = [] (goală)

Greșeli frecvente

  • Apelezi merge pe liste nesortate. Rezultatul este comportament nedefinit (în practică, o listă amestecată). Sortează întâi ambele liste cu sort().
  • Faci splice cu o poziție poz aflată în interiorul intervalului mutat. Nu este permis.

Comenzi înrudite

  • std::list: Listă dublu înlănțuită: inserare și ștergere rapidă oriunde, fără invalidarea celorlalte elemente, dar fără acces după poziție.
  • std::list::sort: sort() sortează lista schimbând doar legăturile dintre noduri; reverse() inversează ordinea elementelor.
  • std::merge: Combină două intervale sortate într-un singur interval sortat, păstrând toate elementele.
  • std::map::extract: extract() scoate un nod din map fără să-l distrugă (îi poți schimba cheia); merge() mută nodurile din alt map.