web-dev-qa-db-fra.com

moyen rapide de copier un vecteur dans un autre

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?

135
Sasha

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

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;

a et b sont des vecteurs.

225
Daniel Earwicker

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.

66
X-Istence

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.

14
Raz
new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2
12
FaridLU

Réponse directe:

  • Utiliser un opérateur =

Nous pouvons utiliser la fonction de membre public std::vector::operator= du conteneur std::vector pour attribuer des valeurs d'un vecteur à un autre.

  • Utiliser une fonction constructeur

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.

Mise en garde:

  • Ne pas utiliser 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.

  • Copie profonde ou superficielle?

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.

Références

La page de std::vector sur cplusplus.com

10
Jerry Yang