Elementen verplaatsen van std::vector naar een andere

Hoe kan ik sommige elementen van de eerste vector naar de tweede verplaatsen en de elementen van de eerste verwijderen?
als ik std::movegebruik, worden de elementen niet uit de eerste vector verwijderd.
dit is de code die ik schreef:

  move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2));

Antwoord 1, autoriteit 100%

Een oude thread nieuw leven inblazen, maar het verbaast me dat niemand std::make_move_iteratorgecombineerd met insert. Het heeft het belangrijke prestatievoordeel van het vooraf toewijzen van ruimte in de doelvector:

v2.insert(v2.end(), std::make_move_iterator(v1.begin() + 7), 
                    std::make_move_iterator(v1.end()));

Zoals anderen al hebben opgemerkt, is de eerste vector v1nu in onbepaalde staat, dus gebruik eraseom de rommel op te ruimen:

v1.erase(v1.begin() + 7, v1.end());

Antwoord 2, autoriteit 87%

std::moveen std::copywerken op elementen, niet op containers. U moet de container afzonderlijk muteren. Om bijvoorbeeld de eerste 17 elementen van v1naar een nieuwe vector v2te verplaatsen:

std::vector<Foo> v1, v2;
// populate v1 with at least 17 elements...
auto it = std::next(v1.begin(), 17);
std::move(v1.begin(), it, std::back_inserter(v2));  // ##
v1.erase(v1.begin(), it);

Na regel ##zijn de eerste 17 elementen van v1er nog steeds, maar ze zijn “verplaatst van”, dus ze bevinden zich in een onbepaald staat.


Antwoord 3, autoriteit 50%

Met std::movekun je de objecten verplaatsen, in plaats van ze te kopiëren, wat een potentieel hogere uitvoeringssnelheid mogelijk maakt. De besparingen kunnen nog groter zijn als u een reeks waarden verplaatst. Als u echter een bereikuit een container verplaatst, bevat de container nog steeds de plaatsen die ooit door deze waarden werden ingenomen.

U moet het formaat van de container handmatig wijzigen om deze tijdelijke aanduidingen te verwijderen als u ze wilt verwijderen (dit hoeft niet, voor het geval u deze containerspots liever opnieuw wilt gebruiken voor andere elementen). Een manier om dit te doen is door vector::erasete bellen. op hetzelfde bereik dat je uit de container hebt gehaald.


Antwoord 4, autoriteit 6%

Je kunt elementen niet van de ene vector naar de andere verplaatsen zoals je denkt; je zult altijd de elementposities van de eerste vector moeten wissen.

Als u alle elementenvan de eerste vector in de tweede wilt veranderen en vice versa, kunt u swap.

Als u dezelfde hoeveelheid elemententussen twee vectoren wilt verplaatsen, kunt u swap_ranges

Other episodes