Je préfère deux manières:
void copyVecFast(const vec<int>& original)
{
vector<int> newVec;
newVec.reserve(original.size());
copy(original.begin(),original.end(),back_inserter(newVec));
}
void copyVecFast(vec<int>& original)
{
vector<int> newVec;
newVec.swap(original);
}
Comment faites-vous?
Réponses:
Votre deuxième exemple ne fonctionne pas si vous envoyez l'argument par référence. Vouliez-vous dire
Cela fonctionnerait, mais un moyen plus simple est
la source
original
est une copie de l'argument de la fonction.Ce ne sont pas les mêmes, n'est-ce pas? L'un est une copie, l'autre est un échange . D'où les noms des fonctions.
Mon préféré est:
Où
a
etb
sont des vecteurs.la source
a = b
alors non. L'affectation signifie: rendrea
égalb
sans changerb
. En revanche,std::swap(a, b)
échangerait leur contenu (sib
l 'size
seraient maintenant ce quia
est avait été auparavant). Vous pensez peut-être à une opération de déplacement (comme cela se produit dans C ++ 11, mais pas dans une affectation ordinaire comme celle-ci). Un tel mouvement laisseraitb
dans un état, euh, "intéressant" - voir stackoverflow.com/questions/17730689/...&&
. Cette version ne sera utilisée que pour une référence rvalue. Il ne correspondra à aucune valeur non constante (commeb
dans mon exemple ci-dessus). Vous pouvezb
en créer un en disanta = std::move(b);
Voir en.cppreference.com/w/cpp/language/value_category pour des niveaux de complexité encore plus élevés.C'est un autre moyen valable de faire une copie d'un vecteur, utilisez simplement son constructeur:
C'est encore plus simple que d'utiliser
std::copy
pour parcourir le vecteur entier du début à la fin versstd::back_insert
le nouveau vecteur.Cela étant dit, le vôtre
.swap()
n'est pas une copie, il échange les deux vecteurs. Vous modifieriez l'original pour ne plus rien contenir! Ce qui n'est pas une copie.la source
a = b;
parce que j'ai déjà un champ membrea
et qu'il me suffit de l'attribuer avec la nouvelle valeur deb
Réponse directe:
=
opérateurNous pouvons utiliser la fonction membre public
std::vector::operator=
du conteneurstd::vector
pour assigner des valeurs d'un vecteur à un autre.En outre, une fonction constructeur a également du sens. Une fonction constructeur avec un autre vecteur comme paramètre (par exemple
x
) construit un conteneur avec une copie de chacun des éléments dansx
, dans le même ordre.Mise en garde:
std::vector::swap
std::vector::swap
ne copie pas un vecteur dans un autre, il échange en fait des éléments de deux vecteurs, comme son nom l'indique. En d'autres termes, le vecteur source à partirstd::vector::swap
duquel copier est modifié après avoir été appelé, ce qui n'est probablement pas ce à quoi vous vous attendez.Si les éléments du vecteur source sont des pointeurs vers d'autres données, une copie complète est parfois souhaitée.
Selon wikipedia:
En fait, il n'existe actuellement aucun moyen intégré en C ++ de faire une copie complète. Tous les moyens mentionnés ci-dessus sont peu profonds. Si une copie complète est nécessaire, vous pouvez parcourir un vecteur et faire une copie des références manuellement. Alternativement, un itérateur peut être envisagé pour le parcours. La discussion sur l'itérateur va au-delà de cette question.
Références
La page de
std::vector
sur cplusplus.comla source
vous ne devez pas utiliser swap pour copier des vecteurs, cela changerait le vecteur "original".
passez plutôt l'original comme paramètre au nouveau.
la source
la source
Dans le cas où le vecteur existait DÉJÀ et que vous vouliez simplement copier, vous pouvez faire ceci:
la source
newVec = oldVec
ce qui est identique à l'une des autres réponses.