J’ai deux vecteurs:
std::vector v1, v2; // Filling v1 ...
Et maintenant je dois copier v1
à v2
. Y a-t-il une raison de préférer
v2 = v1;
à
std::copy (v1.begin(), v1.end(), v2.begin());
(ou vice versa)?
En général, je préférerais vivement v2 = v1
:
std::copy
ne fonctionnera pas si v2
n’a pas la même longueur que v1
(il ne le redimensionnera pas, il conservera donc certains des meilleurs éléments des anciens éléments ( v2.size() > v1.size()
et écraser certaines données aléatoires utilisées ailleurs dans le pire des cas du programme v1
est sur le point d’expirer (et vous utilisez C ++ 11), vous pouvez facilement le modifier pour move
le contenu std::copy
, car les implémenteurs utiliseraient probablement std::copy
interne, si cela apportait un avantage en termes de performances. En conclusion, std::copy
est moins expressif, peut faire la mauvaise chose et n’est même pas plus rapide. Donc, il n’y a pas vraiment de raison de l’utiliser ici.
L’appel de std::copy
peut tenter d’accéder aux éléments au-delà de la fin du vecteur de destination.
Utiliser l’affectation
Il ne vous appartient pas de micro-optimiser: c’est la responsabilité de l’auteur de la bibliothèque et, en fin de compte, la responsabilité du compilateur.
Vous pouvez rendre votre code rapidement arbitraire s’il ne doit pas être correct.
Dans le cas de la copy
, cependant, il est plutôt douteux que ce soit même plus rapide, et ce n’est certainement pas correct pour le cas général.
Si v2
n’est pas assez grand, vous obtiendrez un dépassement de tampon si vous utilisez copy
comme vous l’avez fait.
Vous pouvez utiliser un iterator d’insertion en arrière qui appellera push_back sur v2
. Cependant, cela pourrait conduire à de multiples réallocations en fonction de la taille de v1
.
copy(v1.begin(), v1.end(), back_inserter(v2));
Il vaut mieux laisser le vector
gérer les choses correctement. L’opérateur d’affectation fait cela, comme le fait vector::assign
:
v2.assign(v1.begin(), v1.end());
J’ai une petite idée que l’opérateur d’affectation est implémenté en termes de vector::assign
.
C’est plus court
std::copy
est principalement destiné à la copie de sections de conteneurs. Si vous avez besoin de copier un conteneur entier, vous pouvez aussi utiliser le constructeur de copie.
Affectation, de loin. Plus généralement, chaque fois que la taille du vecteur risque de changer ou de modifier l’intégralité du contenu du vecteur, vous devriez préférer les fonctions membres. Le seul moment où std::copy
serait approprié est si vous remplacez uniquement une petite plage totalement dans le vecteur.
L’assignation est plus claire et utilise en interne std::copy
(ou unitizalized_copy
_M_allocate_and_copy
fonction de la taille et de la capacité). Les performances sont donc les mêmes.