Класс list: перенос элементов из одного списка в другой

Выполнить перенос элементов из одного списка в другой позволяет метод splice(). Прототипы метода:

void splice(const_iterator pos, list &x) noexcept;
void splice(const_iterator pos, list &&x) noexcept;
void splice(const_iterator pos, list &x, const_iterator it) noexcept;
void splice(const_iterator pos, list &&x, const_iterator it) noexcept;
void splice(const_iterator pos, list &x, const_iterator first,
            const_iterator last) noexcept;
void splice(const_iterator pos, list &&x, const_iterator first,
            const_iterator last) noexcept;

Первые два прототипа переносят все элементы из списка x в текущий список, и вставляют их перед позицией pos, на которую указывает итератор. Пример переноса элементов в конец текущего списка:

std::list<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
arr1.splice(arr1.end(), arr2);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl;                // 1 2 3 4 5 6
std::cout << arr2.size() << std::endl; // 0

Третий и четвертый прототипы переносят один элемент, на который указывает итератор it, из списка x в текущий список и вставляют его перед позицией pos, на которую указывает итератор. Перенесем второй элемент из списка arr2 в конец списка arr1:

std::list<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
std::list<int>::iterator it = arr2.begin();
++it;
arr1.splice(arr1.end(), arr2, it);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl;                // 1 2 3 5
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl;                // 4 6

Пятый и шестой прототипы переносят элементы, входящие в диапазон, ограниченный итераторами first и last, из списка x в текущий список и вставляют их перед позицией pos, на которую указывает итератор. Перенесем все элементы, начиная со второго, из списка arr2 в конец списка arr1:

std::list<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
std::list<int>::iterator it = arr2.begin();
++it;
arr1.splice(arr1.end(), arr2, it, arr2.end());
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl;                // 1 2 3 5 6
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl;                // 4

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов