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
mergepe liste nesortate. Rezultatul este comportament nedefinit (în practică, o listă amestecată). Sortează întâi ambele liste cusort(). - Faci
splicecu o pozițiepozaflată î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.