Vecteur converti toutes les valeurs négatives à zéro

J’ai créé un vecteur de taille constante pour stocker les valeurs négatives, puis en imprimant les valeurs, il ne restait que des zéros. Je veux juste savoir pourquoi il ne stocke pas de valeurs négatives.

#include  #include  int main() { std::vector v(5); v.push_back(-1); v.push_back(-2); v.push_back(-3); v.push_back(-4); v.push_back(-5); for (int i=0; i<5; i++) std::cout << v[i] << " "; // All I got was zeroes } 

En effet, push_back place de nouveaux éléments à la fin du vecteur.

Vous pouvez voir l’effet en exécutant i à 9 : les nombres négatifs occuperont v[5] à v[9] .

L’écriture

 std::vector v{-1, -2, -3, -4, -5}; 

est plutôt une solution particulièrement élégante.

Le constructeur que vous appelez remplit les 5 premiers éléments avec des zéros, voir ici (n ° 3 dans la liste des surcharges):

Construit le conteneur avec le nombre d’instances de T insérées par défaut

(où “l’instance par défaut insérée” d’un int est 0). Ce que vous auriez pu souhaiter, c’est

 std::vector v; v.reserve(5); /* Prevent unnecessary allocations as you know the desired size. */ v.push_back(-1); /* ... */ 

Une alternative utilisant l’appel du constructeur d’origine est

 #include  std::vector v(5); std::iota(v.rbegin(), v.rend(), -v.size()); 

Bien que cela fasse plus de travail que nécessaire, chaque élément est d’abord construit par défaut, puis affecté à une nouvelle valeur.

C’est un cas où le principe DRY vous aiderait à comprendre votre erreur.

vector v(5);

for(int i=0;i<5;i++)

Ici, vous créez un tableau pour lequel vous pensez réserver de la place pour 5 éléments. Ensuite, vous insérez ces 5 éléments. Après cela, vous vouliez imprimer le contenu de tout le tableau, mais au lieu d’écrire v.size() , vous avez répété le 5 , de sorte que votre code se présente désormais comme "Imprimer les cinq premiers éléments de v ", au lieu de "Imprimer tous les éléments de v ".

Si vous écrivez plutôt ce que vous voulez dire, vous constaterez que le tableau contient en fait 10 éléments et non 5.

En passant, depuis C ++ 11, vous pouvez parcourir tous les éléments d’une manière plus simple:

 for(int x : v) 

ou, si les éléments étaient d'un type plus coûteux en copie, vous pouvez utiliser des références aux éléments, même auto références de type auto :

 for(auto& x : v) 

Cette nouvelle syntaxe for -loop est appelée la boucle for basée for la plage .

Vous pouvez considérer le vector une version flexible du tableau primitif en C / C ++. Lorsque vous initialisez un vector de taille n , le vector construit a une taille de n (ou peut-être supérieur dans la mémoire, mais vous ne le savez pas car il 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-à-d. Octets). Si vous ne l’initialisez pas avec un paramètre de taille, le vector est vide avec la taille 0, mais il aurait en mémoire une taille de mémoire implicite par défaut.

Supposons que votre vector actuel ait la taille 5. Et que vous souhaitiez push_back() dans un autre élément, le vector interne le tableau entier dans un nouvel emplacement mémoire pouvant contenir toutes ses anciennes entrées plus le nouveau. Vous n’avez donc pas besoin de réaffecter manuellement la mémoire, comme ce que vous devez faire en C.

Ici, dans votre exemple, pour remplir ces 5 entiers négatifs dans votre vector , il y a deux façons.

1) Vous pouvez initialiser un vector sans spécifier sa taille. Et puis appuyez sur chaque élément que vous voulez.

 vector v; for (int i = -1; i >= -5; --i) { v.push_back(i); } 

2) Vous pouvez initialiser le vector à votre manière avec ce paramètre de taille. Et ensuite leur assigner de nouvelles valeurs.

 vector v(5); for (int i = 0; i < v.size(); ++i) { v[i] = -i; } 

3) Vous pouvez également initialiser le vector avec ces entrées lors de sa construction.

  vector v{-1, -2, -3, -4, -5}; or vector v = {-1, -2, -3, -4, -5}; 

Lorsque vous avez déclaré le vecteur avec

 std::vector v(5); 

Vous avez fait en sorte que v stocke cinq espaces de 4 octets en mémoire (en supposant que int = 4 octets sur votre système) et, par défaut, tous ces espaces de 4 octets stockent les bits représentant les 0. Ensuite, vous avez poussé 5 autres ints (-1, -2, -3, -4, -5) à la fin du vecteur avec:

 v.push_back(-1); v.push_back(-2); v.push_back(-3); v.push_back(-4); v.push_back(-5); 

À ce stade, le vecteur a 10 éléments, les cinq premiers étant l’incertitude inconnue qui stocke les 0 sur l’instance où vous avez exécuté le programme. Puisque votre boucle for imprime les cinq premiers éléments du vecteur, c’est pourquoi elle a imprimé tous les 0.