La copie de std::vector: préférez la cession ou std::copy?
J'ai deux vecteurs:
std::vector<int> v1, v2;
//Filling v1
...
Et maintenant j'ai besoin de copier v1
à v2
. Est-il une raison pour préférer
v2 = v1;
à
std::copy (v1.begin(), v1.end(), v2.begin());
(ou vice versa)?
- Opérateur d'affectation va faire la bonne chose. La façon dont vous avez écrit
copy
, il va gâcher siv1
est plus grande quev2
. - Si
v1
n'est pas nécessaire après la copie, vous pourriez justev2.swap(v1);
. - Écrire ce que vous voulez faire. Si vous souhaitez affecter un vecteur à l'autre, d'écrire cela.
Vous devez vous connecter pour publier un commentaire.
Généralement je préfère largement
v2 = v1
:std::copy
ne fonctionnera pas siv2
n'ont pas la même longueur quev1
(il ne sera pas de la redimensionner, de sorte qu'il conservera quelques-uns des vieux éléments dans le meilleur des cas (v2.size() > v1.size()
et écraser des données aléatoires utilisés ailleurs dans le programme pire des casv1
est sur le point d'expirer (et que vous utilisez C++11), vous pouvez facilement le modifier pourmove
le contenustd::copy
, depuis la mise en œuvre serait probablement utiliserstd::copy
en interne, si elle a donné un avantage de performance.En conclusion,
std::copy
est moins expressif, pourrait faire la mauvaise chose et n'est même pas plus vite. Donc il n'y a pas vraiment de raison de l'utiliser ici.std::copy
pour?std::list
à unstd::vector
, ou d'une partie d'unstd::vector
à l'autre partie de la mêmestd::vector
.v2 = v1
cause éléments de v1 à être copié?vector<int>
, sont les entiers copié à partir d'un vecteur à l'autre avecoperator=
, ou avecint
s'constructeur de copie?L'invocation de
std::copy
peuvent tenter d'accéder à des éléments au-delà de la fin de l'vecteur de destination.Utilisation d'affectation.
Ce n'est pas votre travail de micro-optimisation: c'est la bibliothèque de l'écrivain de la responsabilité, et, finalement, le compilateur de la responsabilité.
Vous pouvez rendre votre code arbitrairement rapide si il n'a pas à être correct.
Dans le cas de la
copy
, cependant, il est assez douteux que c'est même plus rapidement, et c'est certainement pas correct pour le cas général.std::vector
sais qu'ils travaillent sur unstd::vector
, et de savoir comment il est mis en œuvre.std::copy
ne dispose pas de cette information. La conclusion est que les fonctions de membre peut probablement faire le travail mieux (et certainement pas le pire).Si
v2
n'est pas assez grand, vous aurez un dépassement de la mémoire tampon si vous utilisezcopy
que vous avez.Vous pouvez utiliser un insert arrière itérateur qui feront appel push_back sur
v2
. Toutefois, cela pourrait conduire à plusieurs réaffectations en fonction de la façon dont grandv1
est.Vous êtes mieux de laisser
vector
gérer les choses correctement. L'opérateur d'affectation de cela, comme le faitvector::assign
:J'ai une petite idée que l'opérateur d'affectation est mis en œuvre en termes de
vector::assign
.C'est plus court.
std::copy
est destiné principalement pour la copie des sections de conteneurs. Si vous avez besoin de copier l'intégralité d'un conteneur, vous pourriez aussi bien utiliser le constructeur de copie.v2
n'est pas assez grand, vous aurez un dépassement de la mémoire tampon.D'affectation, et de loin. Plus généralement, de tout temps, la taille du vecteur sont susceptibles d'évoluer ou de changer l'intégralité du contenu du vecteur, vous devriez préférer les fonctions de membre. La seule fois
std::copy
serait approprié si vous remplacez une petite gamme totalement dans le vecteur.Assignement est plus clair et utilise en interne
std::copy
(ouunitizalized_copy
_M_allocate_and_copy
en fonction de la taille et de capacité) ou si les performances sont les mêmes.