Przeniesienie unique_ptr z jednego wektora do drugiego.

0

Cześć, w moim programie mam dwa wektory przechowujące wskaźniki inteligentne do elementów klasy A.

    std::vector<std::unique_ptr<A>> wektor1;
    std::vector<std::unique_ptr<A>> wektor2;

Załóżmy, że wektor1 ma dziesięć elementów, a wektor2 jest pusty. Jak mógłbym przenieść np. wektor1[5] do wektor2[0]? Z tego co wiem, tych wartości nie można kopiować
Próbowałem robić to w poniższy sposób, ale nie działa.

    wektor2[0] = move(wektor1[5]);

lub

    (werkor1[0]).swap(wektor2[0]);

Próbowałem też korzystać z swap. Ogólnie program się kompiluje, ale podczas działania programu, gdy dochodzimy do tego etapu kodu, program się wywala.

2

o to Ci chodzi?

auto it = next(begin(wektor1), 5); //znajdz iterator
wektor2.emplace_back(move(*it)); //move-construct w nowym, w starym masz nullptr
wektor1.erase(it); //skasuj w starym wektorze
2

Powyższe jest przekombinowane.
Twój oryginalny kod jest prawie prawidłowy, ale zawiera niezdefiniowanie zachowanie.
Jeśli wektor jest pusty, to użycie operatora [] jest zachowaniem niezdefiniowanym (UB) i std::move nie ma nic to do rzeczy.
Musisz zwiększyć wielkość wektora, najprościej:

wektor2.push_back(std::move(wektor1[5]));

Dla kody końcowego, w tym wypadku, nie ma różnicy między push_back, a emplace_back.
push_back jest bardziej tradycyjne, a emplace_back bardziej "sexy".
emplace_back ma skonstruować unique_ptr "na miejscu" za pomocą konstruktora przenoszącego.
push_back teoretycznie robi dodatkowy krok operatorem przypisania przenoszącego, ale optymalizacje kompilatora prowadzą do samego rezultatu.

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