Слияния элементов двух контейнеров

#include <iostream>
#include <string>
#include <list>
using namespace std;
template <typename T>
void SlianyeAndPrint(const list<T> &lst, const list<T> &lst1)
{
    for(auto i = lst.cbegin(); i!=lst.cend(); ++i){
        cout<<*i<<endl; 
    };
}
 
int main()
{
    list<int> Mylist;
    Mylist={1,2,3};
    list<int> Mylist1;
    Mylist1={1,2,3};
    SlianyeAndPrint(Mylist, Mylist1);
    return 0;
}

В общем, я пытаюсь сделать слияние двух контейнеров, чтобы у меня Mylist увеличился в размере и туда записались элементы из Mylist1, но не могу понять как это сделать. Контейнер – список. Может есть какие-то встроенные функции в STL?


Ответы (2 шт):

Автор решения: 4500zenja

Что Вам мешает воспользоваться уже существующим методом list::merge(), тем более что сам тип списка std-базированный? (Единственное но: перед применением нужно предварительно отсортировать списки при помощи list::sort(), потому что merge работает ТОЛЬКО с отсортированными списками)

#include <iostream>
#include <list>
using namespace std;
 
int main()
{
    list<int> Mylist;
    Mylist={1,2,3};
    list<int> Mylist1;
    Mylist1={1,2,3};
    Mylist.sort(); Mylist1.sort();
    Mylist.merge(Mylist1);
    for(auto i = Mylist.cbegin(); i!=Mylist.cend(); ++i){
        cout<<*i<<endl; // 1 1 2 2 3 3
    };
    return 0;
}

UPD: если же нужно вставить элементы последовательно, то сначала нужно сделать аргумент &lst неконстантным — иначе компилятор будет прерывать программу из-за попытки изменить константное значение. Дальше — через list::insert():

#include <iostream>
#include <list>

using namespace std;

template <typename T>
void SlianyeAndPrint(list<T> &lst, const list<T> &lst1)
{
    for (auto i = lst1.cbegin(); i != lst1.cend(); ++i) {
      lst.insert(lst.cend(), *i);
    }
    for (auto i = lst.cbegin(); i != lst.cend(); ++i){
        cout<<*i<<endl; 
    };
}
 
int main()
{
    list<int> Mylist = {1,2,3};
    list<int> Mylist1 = {1,2,3};
    SlianyeAndPrint(Mylist, Mylist1);
    return 0;
}
→ Ссылка
Автор решения: Fat-Zer

Если элементы второго списка сохранять не нужно, то оптимальным способом перенести элементы из одного списка в другой является std::list<T>::splice:

lst.splice(lst.end(), lst1);
→ Ссылка