2010-11-11 32 views
3

J'ai un morceau de code qui crée un std :: vecteur < T> avec une taille connue:Est-ce que push_back() augmente toujours la taille d'un vecteur?

std::vector<T> vectorOfTs(n); 

Est-ce que l'appel augmente push_back la taille à n + 1?

vectorOfTs.push_back(T()); 
+1

Vous avez inclus l'allocation de mémoire comme balise; pourriez-vous élaborer sur ce que vous attendez et qu'est-ce qui vous trouble dans cet aspect? –

Répondre

19

Oui; notez que vector<T>.capacity() est différent de vector<T>.size(). Ce dernier indique le nombre d'éléments actuellement dans le vecteur alors que le premier représente le nombre d'éléments qui correspondent à l'espace actuellement alloué pour le tampon interne du vecteur.

4

Oui. Si vous voulez plutôt l'espace de réserve, réserve d'appel(), .: par exemple

std::vector<T> vectorOfTs; 
vectorOfTs.reserve(n); 
// now size() == 0, capacity() >= n 

vectorOfTs.push_back(T()); 
// now size() == 1 
+1

Votre réponse semble un peu ambiguë, au mieux. 'reserve' ne changera pas la taille, elle réserve juste de la mémoire (et peut donc changer de capacité). – GManNickG

+0

Hmm vraiment?Je présentais cela comme une option différente, si l'intention du PO est de pré-allouer de la mémoire pour un vecteur de taille n plutôt que d'avoir un vecteur de Ts construit par défaut, il pourrait utiliser 'reserve()', mais la réponse principale est "Oui". – Nim

+1

Vous étiez à 99% du chemin; J'ai essayé d'éditer et de supprimer l'ambiguïté que GMan a mentionnée. (La question initiale est vague sur ce qui est attendu et ce qui est confus au sujet de l'allocation.) –

8

Presque. S'il n'y a aucune exception, alors size() va augmenter.

push_back(T()) pourrait aussi lancer une exception à diverses étapes: voir here, ou sommairement:

  • construction T(), auquel cas aucun appel à push_back a lieu, et size() n'est pas affectée

  • si le vector doit augmenter la capacité, qui peut lancer, auquel cas size() n'est pas affecté

  • l'élément vector sera copier ou déplacer construit en utilisant std::allocator_traits<A>::construct(m, p, v);, si A est std::allocator<T>, cela appellera new par emplacements, comme par ::new((void*)p) T(v): si tout cela n'est pas affecté lancers francs, **** de size() le vector moins * **

    • le constructeur de déplacement ne sont pas noexcept et ne jette: dans ce cas, les effets ne sont pas spécifiés
  • de la mise à jour de vecteur puis complète - size() aura incrémentée et la valeur w mal dans le vector (même si T::~T())

0

Oui.

std::vector<T> vectorOfTs(n); 

Dans la déclaration ci-dessus, en fait, vous construisiez nombre « n » de nouvelles instances de type T (à savoir constructeur par défaut T() sera déclenché pour chaque fois). Maintenant vector vectorOfTs contient n éléments. La version suivante du constructeur de vecteur serait invoquée pour l'instruction ci-dessus. Ainsi, lorsque vous repoussez un autre élément dans un vecteur, la taille du vecteur serait n + 1.