103 votes

std::vector::resize() vs. std::vector::reserve()

Il y a un fil dans la section des commentaires dans ce poste sur l'utilisation std::vector::reserve() vs. std::vector::resize() .

Voici le code original :

void MyClass::my_method()
{
    my_member.reserve(n_dim);
    for(int k = 0 ; k < n_dim ; k++ )
         my_member[k] = k ;
}

Je crois que pour écrire des éléments dans le vector la chose correcte à faire est d'appeler std::vector::resize() pas std::vector::reserve() .

En fait, le code de test suivant "plante" dans les constructions de débogage dans VS2010 SP1 :

#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    v.reserve(10);
    v[5] = 2;

    return 0;
}

Ai-je raison, ou ai-je tort ? Et VS2010 SP1 est-il bon ou mauvais ?

1voto

PorkyBrain Points 1955

Le redimensionnement modifie en fait la quantité d'éléments dans le vecteur, de nouveaux éléments sont construits par défaut si le redimensionnement entraîne une croissance du vecteur.

vector<int> v;
v.resize(10);
auto size = v.size();

dans ce cas, la taille est de 10.

reserve, quant à elle, demande seulement que le tampon interne atteigne la taille spécifiée, mais ne change pas la "taille" du tableau, seule la taille de son tampon est modifiée.

vector<int> v;
v.reserve(10);
auto size = v.size();

dans ce cas, la taille est toujours 0.

Donc, pour répondre à votre question, oui, vous avez raison, même si vous réservez suffisamment d'espace, vous accédez toujours à de la mémoire non initialisée avec l'opérateur d'indexation. Avec un int, ce n'est pas si grave, mais dans le cas d'un vecteur de classes, vous accédez à des objets qui n'ont pas été construits.

La vérification des limites des compilateurs réglés en mode débogage peut évidemment être perturbée par ce comportement, ce qui peut expliquer le plantage.

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