lista unique_ptr-ów

0

Witam
Mam 2 pytania do poniższego kodu typowo pod rozmowę rekrutacyjną bo w codziennym programowaniu to niżej wystarcza.:)

    list<unique_ptr<int>> l4;
    l4.emplace_back(make_unique<int>(4));
    l4.emplace_back(make_unique<int>(5));
    l4.emplace_back(make_unique<int>(6));
    list<unique_ptr<int>> l5;
    l5.emplace_back(make_unique<int>(7));
    l5.emplace_back(make_unique<int>(8));
    for (auto& x: l5)
        l4.emplace_back(move(x));   //after this one l5 size is still 2, but its elements of type unique_ptr has nullptr int members

1.) Jest jakiś sposób by zainicjować liste l4, l5 za pomocą konstruktora, tudzież initializer_list? Mi się wydaje że nie bo jak próbuję to nic się nie kompiluje, wygląda jakby initializer_list kopiował a nie przenosił obiekty do kontenera.
2.) Jest jakaś metoda z stl-a którą można by przenieść obiekty z l5 do l4 bez wczesniejszego robienia resize na l4:

l4.resize(l4.size() + l5.size()) 
move(l5.begin(), l5.end(), l4.end())

Ja nic nie znalazłem, wygląda jakby nie było takiej metody.

1

Przede wszystkim, zastanów się czy chcesz używać std::list. Bardzo często nie chcesz.

initializer_list zwraca T const* jako iteratory, więc nie da się z niej przenieść, można tylko skopiować. std::list i inne kontenery standardowe nic na to nie poradzą, ale jeśli piszesz coś własnego (zastanów się zanim to zrobisz), to możesz użyć variadic templates, opisałem coś podobnego tutaj.

Pytanie drugie:

l4.resize(l4.size() + l5.size()) 
move(l5.begin(), l5.end(), l4.end())

To nie wygląda na poprawny kod. Nie kompiluje się (brak średników) i zapisuje poza l4.end() (chciałeś stare l4.end(), a nie nowe). Następujące powinno zadziałać, ale nie testowałem:

std::move(l5.begin(), l5.end(), std::back_inserter(l4));

Lub, konkretnie dla std::list możesz użyć splice():

l4.splice(l4.end(), l5.begin(), l5.end());

1 użytkowników online, w tym zalogowanych: 0, gości: 1