Метод splice
Метод splice класса list перемещает элементы из одного списка в другой.
В отличие от метода insert, который копирует элементы, splice
изменяет связи между узлами, что делает операцию очень эффективной.
Метод имеет несколько перегрузок. В первом варианте мы передаем позицию,
куда следует вставить элементы, и список-источник. Во втором варианте
дополнительно передается итератор, указывающий на перемещаемый элемент.
В третьем варианте передается диапазон итераторов.
Синтаксис
// Переместить все элементы из other в позицию pos
list.splice(pos, other)
// Переместить элемент it из other в позицию pos
list.splice(pos, other, it)
// Переместить диапазон [first, last) из other в позицию pos
list.splice(pos, other, first, last)
Пример
Давайте переместим все элементы из одного списка в другой:
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> lst1 = {1, 2, 3};
list<int> lst2 = {4, 5, 6};
lst1.splice(lst1.end(), lst2);
for (int el : lst1) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 5 6
Пример
Давайте переместим только один элемент из одного списка в другой:
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> lst1 = {1, 2, 3};
list<int> lst2 = {4, 5, 6};
auto it = lst2.begin();
it++;
lst1.splice(lst1.begin(), lst2, it);
for (int el : lst1) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
5 1 2 3
Пример
Давайте переместим диапазон элементов из одного списка в другой:
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> lst1 = {1, 2, 3};
list<int> lst2 = {4, 5, 6, 7};
auto first = lst2.begin();
auto last = lst2.begin();
last++;
last++;
lst1.splice(lst1.end(), lst2, first, last);
for (int el : lst1) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 5