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?
Votre deuxième exemple ne fonctionne pas si vous envoyez l'argument par référence. Vouliez-vous dire
void copyVecFast(vec<int> original) // no reference
{
vector<int> new_;
new_.swap(original);
}
Cela fonctionnerait, mais un moyen plus facile est
vector<int> new_(original);
Ils ne sont pas les mêmes, n'est-ce pas? L'un est une copie, l'autre un échange. D'où les noms de fonctions.
Mon préféré est:
a = b;
Où a
et b
sont des vecteurs.
C'est un autre moyen valable de faire une copie d'un vecteur. Il suffit d'utiliser son constructeur:
std::vector<int> newvector(oldvector);
C’est encore plus simple que d’utiliser std::copy
pour faire passer tout le vecteur du début à la fin jusqu’à std::back_insert
dans le nouveau vecteur.
Ceci étant dit, votre .swap()
one n'est pas une copie, mais échange les deux vecteurs. Vous modifieriez l'original pour ne plus rien contenir! Ce qui n'est pas une copie.
vous ne devriez pas utiliser swap pour copier des vecteurs, cela changerait le vecteur "original".
passez l'original en tant que paramètre à la nouvelle.
new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2
=
Nous pouvons utiliser la fonction de membre public std::vector::operator=
du conteneur std::vector
pour attribuer des valeurs d'un vecteur à un autre.
En outre, une fonction constructeur a également un 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 de x
, dans le même ordre.
std::vector::swap
std::vector::swap
n'est pas en train de copier d'un vecteur à un autre, il s'agit en fait d'échanger des éléments de deux vecteurs, comme son nom l'indique. En d'autres termes, le vecteur source à copier est modifié après l'appel de std::vector::swap
, ce qui n'est probablement pas ce que vous attendiez.
Si les éléments du vecteur source sont des pointeurs vers d'autres données, une copie complète est parfois souhaitée.
Selon Wikipédia:
Une copie profonde, ce qui signifie que les champs sont déréférencés: plutôt que des références aux objets en cours de copie, de nouveaux objets de copie sont créés pour tous les objets référencés, et des références à ceux-ci sont placées dans B.
En réalité, il n'existe actuellement aucun moyen intégré en C++ de faire une copie en profondeur. Tous les moyens mentionnés ci-dessus sont peu profonds. Si une copie en profondeur est nécessaire, vous pouvez parcourir un vecteur et copier les références manuellement. Alternativement, un itérateur peut être envisagé pour la traversée. La discussion sur itérateur est au-delà de cette question.