web-dev-qa-db-fra.com

Déplacer des éléments de std :: vector vers un autre

Comment puis-je déplacer certains éléments du premier vecteur au second, et les éléments seront supprimés du premier?
si j'utilise std::move, les éléments non supprimés du premier vecteur.
voici le code que j'ai écrit:

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

Le std::move vous permet de déplacer les objets, au lieu de les copier, ce qui permet une vitesse d'exécution potentiellement plus rapide. Les économies peuvent être encore plus importantes lorsque vous déplacez une plage de valeurs. Cependant, lorsque vous faites déplacer une plage à partir d'un conteneur, le conteneur contient toujours les emplacements qui étaient autrefois occupés par ces valeurs.

Vous devez redimensionner le conteneur manuellement pour supprimer ces espaces réservés si vous souhaitez vous en débarrasser (vous n'êtes pas obligé, au cas où vous préféreriez réutiliser ces emplacements de conteneur pour d'autres éléments). Une façon de le faire est d'appeler vector::erase sur la même plage que celle que vous avez sortie du conteneur.

23
dasblinkenlight

std::move et std::copy opère sur éléments, pas conteneurs. Vous devez muter le conteneur séparément. Par exemple, pour déplacer les 17 premiers éléments de v1 dans un nouveau vecteur v2:

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);

Après la ligne ##, les 17 premiers éléments de v1 sont toujours là, mais ils ont été "déplacés", ils sont donc dans un état indéterminé.

46
Kerrek SB

Ressusciter un vieux fil, mais je suis surpris que personne n'ait mentionné std::make_move_iterator combiné avec insert. Il présente l'avantage de performances important de la préallocation d'espace dans le vecteur cible:

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

Comme d'autres l'ont souligné, le premier vecteur v1 est maintenant dans un état indéterminé, utilisez donc erase pour effacer le désordre:

v1.erase(v1.begin() + 7, v1.end());
34
Miljen Mikic

Vous ne pouvez pas déplacer des éléments d'un vecteur à un autre comme vous le pensez; vous devrez toujours effacer les positions des éléments du premier vecteur.

Si vous voulez changer tous les éléments du premier vecteur au second et vice versa, vous pouvez utiliser swap .

Si vous souhaitez déplacer la même quantité d'éléments entre deux vecteurs, vous pouvez utiliser swap_ranges

3
alestanis