Слияния элементов двух контейнеров
#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 шт):
Что Вам мешает воспользоваться уже существующим методом 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;
}
Если элементы второго списка сохранять не нужно, то оптимальным способом перенести элементы из одного списка в другой является std::list<T>::splice:
lst.splice(lst.end(), lst1);