moyen rapide pour copier un vecteur dans un autre
Je préfère deux façons:
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 voulez-vous faire?
- La deuxième a un nom trompeur - comme il n'est pas une copie (même si c'est rapide).
Vous devez vous connecter pour publier un commentaire.
Votre deuxième exemple ne fonctionne pas si vous envoyez l'argument par référence. Vouliez-vous dire
Qui serait à l'œuvre, mais un moyen plus facile est
original
est une copie de l'argument de fonction.Ils ne sont pas les même, sont-ils? L'un est une copie, l'autre est un swap. D'où les noms de fonction.
Mon préféré est:
Où
a
etb
sont des vecteurs.a = b
alors non. L'affectation des moyens: fairea
l'égalité desb
sans changerb
. En revanche,std::swap(a, b)
d'échange, leur contenu (doncb
'ssize
serait maintenant ce quea
's l'avait été avant). Vous êtes peut-être penser à une opération de déplacement (comme c'est le cas en C++11, mais pas dans une simple affectation de ce genre). Une telle démarche serait de quitterb
dans une, ahem, "intéressant" de l'état - voir le stackoverflow.com/questions/17730689/...auto_ptr
qui met en œuvre la cession, à tort, de sorte qu'il a effectué un déplacement.&&
. Cette version sera utilisée uniquement pour référence rvalue. Il ne correspond pas à toutes les non-const valeur (commeb
dans mon exemple ci-dessus). Vous pouvez activerb
dans un en disanta = std::move(b);
Voir en.cppreference.com/w/cpp/language/value_category pour encore plus de niveaux de complexité.C'est un autre moyen valable de faire une copie d'un vecteur, il suffit d'utiliser son constructeur:
C'est même plus simple que d'utiliser
std::copy
à marcher toute vecteur à partir de début à la fin destd::back_insert
dans le nouveau vecteur.Cela étant dit, votre
.swap()
l'un n'est pas une copie, au lieu d'intervertir les deux vecteurs. Vous devez modifier l'original ne contient plus rien! Ce qui n'est pas une copie.vous ne devriez pas utiliser swap pour copier des vecteurs, il allait changer de "l'original" vecteur.
passer l'origine en tant que paramètre à la nouvelle place.
Réponse directe:
=
opérateurNous pouvons utiliser la fonction membre public
std::vector::operator=
du conteneurstd::vector
pour assigner des valeurs à partir d'un vecteur à l'autre.En outre, une fonction constructeur a aussi du sens. Une fonction constructeur avec un autre vecteur de paramètre(par exemple,
x
) construit un conteneur avec une copie de chacun des éléments dex
, dans le même ordre.Attention:
std::vector::swap
std::vector::swap
n'est pas copie un vecteur à l'autre, il est en fait la permutation des éléments de deux vecteurs, comme son nom l'indique. En d'autres termes, le vecteur source pour la copie est modifiée aprèsstd::vector::swap
est appelée, ce qui n'est probablement pas ce que l'on attend.Si les éléments dans le vecteur source sont des pointeurs vers d'autres données, puis d'une copie en profondeur est voulu parfois.
Selon wikipedia:
En fait, il n'existe pas actuellement une méthode intégrée en C++ pour faire une copie en profondeur. De toutes les façons mentionnées ci-dessus sont peu profondes. Si une copie en profondeur est nécessaire, vous pouvez parcourir un vecteur et faire une copie de manuellement les références. Sinon, un itérateur peut être considéré pour la traversée. Discussion sur itérateur est au-delà de cette question.
Références
La page
std::vector
sur cplusplus.comDans le cas où le vecteur existait DÉJÀ et que vous vouliez juste de copier, vous pourriez faire ceci:
newVec = oldVec
qui est le même que celui des autres réponses.