Comment cela fonctionne
Il s'agit d'une mise en œuvre spécifique, mais en général, la structure de données vectorielle interne aura un pointeur vers le bloc de mémoire où les éléments résident réellement. GCC et VC++ allouent 0 élément par défaut. Vous pouvez donc considérer que le pointeur de mémoire interne du vecteur est le suivant nullptr
par défaut.
Lorsque vous appelez vector<int> vec(N);
comme dans votre option 1, les objets N sont créés en utilisant le constructeur par défaut. Celui-ci est appelé Constructeur de remplissage .
Quand vous le faites vec.reserve(N);
après Constructeur par défaut comme dans l'option 2, vous obtenez un bloc de données pour contenir 3 éléments mais aucun objet n'est créé contrairement à l'option 1.
Pourquoi choisir l'option 1
Si vous connaissez le nombre d'éléments que contiendra le vecteur et que vous risquez de laisser la plupart des éléments à leurs valeurs par défaut, vous pouvez utiliser cette option.
Pourquoi choisir l'option 2
Cette option est généralement la meilleure des deux car elle ne fait qu'allouer un bloc de données pour une utilisation future et ne se remplit pas d'objets créés par le constructeur par défaut.