Vous pouvez considérer le vector
une version flexible du tableau primitif en C/C++. Lorsque vous initialisez un vector
avec une taille n
, le construit vector
a une taille de n
(ou peut-être plus grand dans la mémoire, mais vous ne le savez pas puisque c'est implicitement géré par le compilateur). Notez qu'ici n
représente le nombre d'entrées, mais pas l'utilisation réelle de la mémoire (c'est-à-dire les octets). Si vous ne l'initialisez pas avec un paramètre de taille, la fonction vector
est vide avec une taille de 0, mais dans la mémoire, elle aurait une taille implicite par défaut.
Supposons que votre vector
a la taille 5. Et vous voulez push_back()
dans un autre élément, alors le vector
réaffectera en interne l'ensemble du tableau dans un nouvel emplacement mémoire qui pourra contenir toutes les anciennes entrées plus la nouvelle. Vous n'avez donc pas besoin de réallouer la mémoire manuellement, comme vous devez le faire en C.
Ici, dans votre exemple, pour remplir ces 5 entiers négatifs dans votre vector
Il y a plusieurs façons de procéder.
1) Vous pouvez initialiser un vector
sans en préciser la taille. Ensuite, vous pouvez insérer chaque élément que vous souhaitez.
vector<int> v;
for (int i = -1; i >= -5; --i) {
v.push_back(i);
}
2) Vous pouvez initialiser le vector
avec ce paramètre de taille. Ensuite, attribuez-leur de nouvelles valeurs.
vector<int> v(5);
for (int i = 0; i < v.size(); ++i) {
v[i] = -i;
}
3) Vous pouvez également initialiser le vector
avec ces entrées lorsqu'il est construit.
vector<int> v{-1, -2, -3, -4, -5};
or vector<int> v = {-1, -2, -3, -4, -5};
1 votes
C'est une joli bon exemple minimal reproductible . L'étape suivante aurait consisté à vérifier vos hypothèses, dont la plus pertinente est que
std::vector<int> v(5)
construit un vecteur vide avec une capacité de 5 éléments. Ceci est assez facile à tester en vérifiant la documentation ou d'imprimer le.size()
du vecteur (bien que ce dernier point puisse impliquer une hypothèse sur la signification de la "taille", que vous devriez également tester).1 votes
IMO, la manière la plus simple de déboguer ce problème est de vérifier la valeur du dernier élément, dans ce cas ce serait
v.back()
.2 votes
Il est souvent judicieux de passer en boucle de
0
asize()
(au lieu d'une valeur codée en dur) si vous voulez faire une boucle sur un conteneur (ou, mieux encore, utiliserfor (int i: v)
) - cela permet de repérer plus facilement les bogues comme celui-ci et d'augmenter plus facilement la taille du conteneur, si vous souhaitez le faire un jour.1 votes
Si vous voulez utiliser un vecteur de taille constante, utilisez plutôt std::array