Malheureusement, la norme ne spécifie pas le comportement de l'assignation des conteneurs de séquences en fonction de l'allocateur, et est en fait strictement inconsistante.
Nous savons (à partir du tableau 28 et de 23.2.1p7) que si allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value
es true
alors l'allocateur est remplacé lors de l'affectation des copies. De plus, d'après les tableaux 96 et 99, nous constatons que la complexité de l'affectation des copies est linéaire et le post-condition sur le fonctionnement a = t
c'est que a == t
c'est-à-dire (Tableau 96) que distance(a.begin(), a.end()) == distance(t.begin(), t.end()) && equal(a.begin(), a.end(), t.begin())
. D'après 23.2.1p7, après l'affectation de la copie, si l'allocateur propage, alors a.get_allocator() == t.get_allocator()
.
En ce qui concerne la capacité vectorielle, 23.3.6.3 [capacité.vecteur] a :
5 - Remarques : La réaffectation invalide toutes les références, pointeurs et itérateurs se référant aux éléments de la séquence. Il est garanti qu'aucune réallocation n'a lieu pendant les insertions qui se produisent après un appel à reserve()
jusqu'au moment où une insertion rendrait la taille du vecteur supérieure à la valeur de capacity()
.
Si nous prenons bibliothèque DR341 comme guide de lecture de la norme :
Cependant, la formulation de 23.3.6.3 [vector.capacity]paragraphe 5 empêche la réduction de la capacité d'un vecteur, suite à un appel à reserve(). Cela invalide l'idiome, car swap() est ainsi empêché de réduire la capacité. [...]
Le DR341 a été résolu en ajoutant des paragraphes dans le paragraphe 23.3.6.3 :
void swap(vector<T,Allocator>& x);
7 - Effets : Échange le contenu et capacity()
de *this
avec celle de x
.
8 - La complexité : Temps constant.
La conclusion est que, du point de vue du comité de la Bibliothèque, les opérations ne modifient que capacity()
si elle est mentionnée au point 23.3.6.3. L'attribution de la copie n'est pas mentionnée dans l'article 23.3.6.3, et ne modifie donc pas l'article 23.3.6.3. capacity()
. (L'affectation de Move a le même problème, surtout si l'on tient compte de la résolution proposée de Bibliothèque DR2321 .)
Il s'agit clairement d'un défaut de la norme, car l'affectation par copie propage des allocateurs inégaux. debe entraîner une réaffectation, ce qui contredit l'article 23.3.6.3p5.
Nous pouvons nous attendre et espérer que ce défaut sera résolu en faveur de :
- non réduit
capacity()
sur l'affectation de copie non modifiable par l'allocateur ;
- non spécifié
capacity()
sur l'affectation des copies modifiant l'allocateur ;
- non réduit
capacity()
sur l'affectation des déplacements sans propagation de l'allocateur ;
- conteneur-source
capacity()
sur l'affectation des déplacements par propagation de l'allocateur.
Cependant, dans la situation actuelle et jusqu'à ce que cela soit clarifié, vous feriez bien de ne pas dépendre d'un comportement particulier. Heureusement, il existe une solution de contournement simple qui garantit de ne pas réduire le nombre d'utilisateurs. capacity()
:
bigVector.assign(littleVector.begin(), littleVector.end());