Hoe kan ik sommige elementen van de eerste vector naar de tweede verplaatsen en de elementen van de eerste verwijderen?
als ik std::move
gebruik, 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_iterator
gecombineerd 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 v1
nu in onbepaalde staat, dus gebruik erase
om de rommel op te ruimen:
v1.erase(v1.begin() + 7, v1.end());
Antwoord 2, autoriteit 87%
std::move
en std::copy
werken op elementen, niet op containers. U moet de container afzonderlijk muteren. Om bijvoorbeeld de eerste 17 elementen van v1
naar een nieuwe vector v2
te 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 v1
er nog steeds, maar ze zijn “verplaatst van”, dus ze bevinden zich in een onbepaald staat.
Antwoord 3, autoriteit 50%
Met std::move
kun 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::erase
te 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