53 votes

La capacité est-elle copiée dans un vecteur?

Prenez le code suivant:

 std::vector<int> a;
a.reserve(65536);
std::vector<int> b(a);  //NOTE: b is constructed from a

a.reserve(65536); // no reallocation
b.reserve(65536);
 

La capacité est-elle copiée? Y aura-t-il une réaffectation sur la dernière ligne? La norme dit-elle quelque chose à ce sujet ou est-ce que c'est silencieux?

43voto

La capacité est copié?

Dans la pratique, non. Je l'ai testé en ligne de Clang et GCC ainsi que MSVC et aucun d'entre eux copie de la capacité.

Aura-t-il une réaffectation sur la dernière ligne?

Si la capacité est inférieure à l'argument de la réserve (c'est à dire qu'il ne soit pas copié), alors oui.

La norme dit rien à ce sujet ou est-il silencieux?

Aucune définition pour le constructeur de copie sont fournis dans le vecteur.les inconvénients. Au lieu de cela nous devons nous pencher sur le conteneur.exigences

X désigne une classe de conteneur contenant des objets de type T, aet b dénotent des valeurs de type X, u indique un identificateur, rindique un non-const valeur de type X, et rv indique une non-const rvalue de type X.

X u(a)

X u = a;

Nécessite: T est CopyInsertable en X (voir ci-dessous).

post: u == a

Maintenant ce que signifient-ils pour les deux contenants pour être égaux?

a == b

== est une relation d'équivalence. equal(a.begin(), a.end(), b.begin(), b.end())

En d'autres termes, puisqu'il ne nécessite pas d' capacity à l'égalité dans la comparaison, il n'y a aucune raison pour copier l' capacity.

4voto

Non, il n'est pas garanti que la capacité soit préservée grâce à une construction de copie vector .

Vous pouvez le faire comme suit:

 vector<int> b;
b.reserve( a.capacity() );
b = a;
 

Mieux encapsulé dans une fonction.

4voto

AnatolyS Points 870

Standard ne dit rien sur la préservation de la capacité lorsque vous appelez le constructeur de copie. Donc, vous n'avez aucune garantie à ce sujet.

Mais vous pouvez faire le tour suivant, qui permute les états de a et b, si vous avez besoin de conserver la capacité dans la copie uniquement:

  std::vector<int> a;
 a.reserve(65536);
 std::vector<int> b(a);
 b.swap(a); // now b has a's state
 assert(b.capacity() == 65536); 
 

1voto

Eissa N. Points 1188

Eh bien, un simple contrôle comme celui-ci révèle que la capacité n’est pas copiée:

 std::vector<int> a;
a.reserve(65536);
cout << "a.capacity is " << a.capacity() << endl; // prints 65536

std::vector<int> b(a);  //NOTE: b is constructed from a
cout << "b.capacity is " << b.capacity() << endl; // prints 0
 

Je crois que lors de la copie du vecteur a b , la capacité de b est définie sur la taille de a dans la plupart des compilateurs; bien que cela ne soit pas garanti.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X