Maison > développement back-end > C++ > std::vector::reserve() vs std::vector::resize() : quand dois-je utiliser lequel ?

std::vector::reserve() vs std::vector::resize() : quand dois-je utiliser lequel ?

Mary-Kate Olsen
Libérer: 2024-12-29 13:04:22
original
346 Les gens l'ont consulté

std::vector::reserve() vs. std::vector::resize(): When Should I Use Which?

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;
}
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal