Comprendre la différence : std::vector::resize() vs std::vector::reserve()
Le sujet de std::vector::reserve() par rapport à std::vector::resize() a suscité des discussions au sein de la communauté des programmeurs. Cet article vise à clarifier leurs rôles distincts dans la manipulation de vecteurs.
std::vector::reserve()
std::vector::reserve() alloue de la mémoire pour le nombre d'éléments spécifié mais ne redimensionne pas le vecteur lui-même. Le vecteur conserve sa taille logique d'origine. Cette méthode est bénéfique lorsque vous prévoyez d'ajouter des éléments au vecteur et que vous souhaitez optimiser les performances en pré-allouant de la mémoire.
std::vector::resize()
std : :vector::resize() modifie la taille du vecteur au nombre d'éléments spécifié. Si le vecteur doit être étendu, il allouera de la mémoire supplémentaire. Contrairement à reserve(), resize() initialise tous les nouveaux éléments à leurs valeurs par défaut.
Exemple d'utilisation
Considérez le code fourni dans la question :
void MyClass::my_method() { my_member.reserve(n_dim); for (int k = 0; k < n_dim; k++) my_member[k] = k; }
Selon la réponse, l'utilisation de reserve() ici est incorrecte. Pour écrire correctement des éléments dans le vecteur, il faut utiliser resize() :
void MyClass::my_method() { my_member.resize(n_dim); for (int k = 0; k < n_dim; k++) my_member[k] = k; }
Comportement de Visual Studio 2010 SP1
Le comportement de "plantage" mentionné du code dans Visual Studio 2010 SP1 est cohérent avec le comportement correct décrit dans la réponse. Tenter d'accéder à un élément au-delà de la taille logique du vecteur (dans ce cas, my_member[5]) avant de redimensionner le vecteur entraîne un comportement indéfini.
Réserve et invalidation
Il est important de noter que l'utilisation de reserve() puis l'ajout d'éléments via push_back() peuvent invalider les références, les itérateurs ou les pointeurs vers les données du vecteur. En effet, reserve() alloue de la mémoire sans redimensionner, et lorsque de nouveaux éléments sont ajoutés, ils peuvent être placés à un emplacement différent.
En conclusion, std::vector::reserve() et std::vector ::resize() ont des objectifs distincts. Reserve() pré-alloue de la mémoire, tandis que resize() modifie la taille du vecteur et initialise les nouveaux éléments. Comprendre leurs différences est essentiel pour une manipulation efficace des vecteurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!