56 votes

Comment introduire des valeurs dans un vecteur

J'essaie de demander à l'utilisateur d'entrer des nombres qui seront poussés dans un vecteur, puis d'utiliser un appel de fonction pour compter ces nombres.

Pourquoi cela ne fonctionne-t-il pas ? Je ne peux compter que le premier nombre.

template <typename T>
void write_vector(const vector<T>& V)
{
   cout << "The numbers in the vector are: " << endl;
  for(int i=0; i < V.size(); i++)
    cout << V[i] << " ";
}

int main()
{
  int input;
  vector<int> V;
  cout << "Enter your numbers to be evaluated: " << endl;
  cin >> input;
  V.push_back(input);
  write_vector(V);
  return 0;
}

0 votes

D'après mon expérience, cin ne capture que le premier token d'une chaîne, donc tout ce qui se trouve après un espace est coupé. Si vous voulez vraiment utiliser cin, lisez chaque variable séparément, ou demandez à l'utilisateur de séparer les valeurs par une virgule et de les analyser. Ou vous pouvez utiliser le tableau argv dans la méthode principale.

3 votes

Avez-vous essayé d'utiliser une variable supplémentaire ? Au lieu d'utiliser n pour la taille et l'entrée temporaire.

3 votes

Vous devriez expliquer ce qui ne fonctionne pas ici.

47voto

jsinger Points 737

En l'état, vous ne lisez qu'un seul entier et le placez dans votre vecteur. Comme vous souhaitez probablement stocker plusieurs entiers, vous avez besoin d'une boucle. Par exemple, remplacez

cin >> input;
V.push_back(input);

avec

while (cin >> input)
    V.push_back(input);

Ceci a pour effet de tirer continuellement des entrées de cin tant qu'il y a des entrées à saisir ; la boucle continue jusqu'à ce que cin trouve EOF ou essaie d'entrer une valeur non entière. L'alternative est d'utiliser une valeur sentinelle, bien que cela vous empêche d'entrer réellement cette valeur. Ex :

while ((cin >> input) && input != 9999)
    V.push_back(input);

sera lue jusqu'à ce que vous essayiez d'entrer 9999 (ou tout autre état qui rendrait cin invalide), auquel cas la boucle se terminera.

21voto

Jon Purdy Points 19408

D'autres réponses vous amèneraient à interdire un nombre particulier ou à demander à l'utilisateur d'entrer quelque chose de non numérique pour mettre fin à la saisie. Une meilleure solution consiste peut-être à utiliser std::getline() pour lire un ligne d'entrée, puis utiliser std::istringstream pour lire tous les nombres de cette ligne dans le vecteur.

#include <iostream>
#include <sstream>
#include <vector>

int main(int argc, char** argv) {

    std::string line;
    int number;
    std::vector<int> numbers;

    std::cout << "Enter numbers separated by spaces: ";
    std::getline(std::cin, line);
    std::istringstream stream(line);
    while (stream >> number)
        numbers.push_back(number);

    write_vector(numbers);

}

En outre, votre write_vector() peut être remplacée par un appel plus idiomatique à la fonction std::copy() pour copier les éléments dans un std::ostream_iterator à std::cout :

#include <algorithm>
#include <iterator>

template<class T>
void write_vector(const std::vector<T>& vector) {
    std::cout << "Numbers you entered: ";
    std::copy(vector.begin(), vector.end(),
        std::ostream_iterator<T>(std::cout, " "));
    std::cout << '\n';
}

Vous pouvez également utiliser std::copy() et quelques itérateurs pratiques pour obtenir les valeurs dans le vecteur sans boucle explicite :

std::copy(std::istream_iterator<int>(stream),
    std::istream_iterator<int>(),
    std::back_inserter(numbers));

Mais c'est probablement exagéré.

20voto

Nawaz Points 148870

Vous avez besoin d'une boucle pour cela. Voici donc ce qu'il faut faire :

while (cin >> input) //enter any non-integer to end the loop!
{
   V.push_back(input);
}

Ou utilisez cette version idiomatique :

#include <iterator> //for std::istream_iterator 

std::istream_iterator<int> begin(std::cin), end;
std::vector<int> v(begin, end);
write_vector(v);

Vous pouvez également améliorer votre write_vector comme :

 #include <algorithm> //for std::copy

template <typename T>
void write_vector(const vector<T>& v)
{
   cout << "The numbers in the vector are: " << endl;
   std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
}

0 votes

Maintenant, il est coincé dans une boucle continue de demande de chiffres.

0 votes

Saisissez un nombre non entier pour mettre fin à la boucle !

0 votes

Si je demande à l'utilisateur de saisir un certain nombre d'entrées, comment puis-je l'arrêter après ce nombre ?

14voto

H_meir Points 313

Vous avez deux possibilités :

Si vous connaissez la taille du vecteur (dans votre cas/exemple, il semble que vous la connaissiez) :

vector<int> V(size)
for(int i =0;i<size;i++){
    cin>>V[i];
 }

si ce n'est pas le cas et que vous n'arrivez pas à l'intégrer dans votre programme, c'est qu'il n'y a pas d'autre solution :

int helper;
while(cin>>helper){
    V.push_back(helper);
}

0 votes

C'est exactement ce dont j'avais besoin.

8voto

阿尔曼 Points 57

Si vous connaissez la taille du vecteur, vous pouvez procéder comme suit :

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> v(n);
    for (auto &it : v) {
        cin >> it;
    }
}

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