web-dev-qa-db-fra.com

Comment cintre à un vecteur

J'essaie de demander à l'utilisateur d'entrer des nombres qui sont placés dans un vecteur, Puis en utilisant un appel de fonction pour calculer les nombres, pourquoi cela ne fonctionne-t-il pas? Je ne suis capable que de composer le premier numéro.

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;
}
33
Sean

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

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

avec

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

Ce que cela fait est 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 tente d'entrer une valeur non entière. L'alternative consiste à utiliser une valeur sentinelle, même si cela vous empêche de saisir cette valeur. Ex:

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

lira jusqu'à ce que vous essayiez de saisir 9999 (ou l'un des autres états rendant le cin invalide), moment auquel la boucle se terminera.

27
jsinger

Dans d’autres réponses, vous pourriez interdire un numéro particulier ou demander à l’utilisateur de saisir quelque chose de non numérique pour mettre fin à la saisie. Une meilleure solution consiste peut-être à utiliser std::getline() pour lire un line of input, 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);

}

De plus, votre implémentation write_vector() peut être remplacée par un appel plus idiomatique à l'algorithme std::copy() pour copier les éléments dans un std::ostream_iterator dans 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é.

16
Jon Purdy

Vous avez besoin d'une boucle pour cela. Alors faites ceci:

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 en tant que:

 #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, " "));
}
11
Nawaz

vous avez 2 options:

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

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

si ce n'est pas le cas et que vous ne pouvez pas l'obtenir dans votre flux de programme, alors:

int helper;
while(cin>>helper){
    V.Push_back(helper);
}
7
H_meir

One-liner pour lire un nombre - fixé dans un vecteur (C++ 11):

#include <algorithm>
#include <iterator>
#include <iostream>
#include <vector>
#include <cstddef>

int main()
{
    const std::size_t LIMIT{5};
    std::vector<int> collection;

    std::generate_n(std::back_inserter(collection), LIMIT,
        []()
        {
            return *(std::istream_iterator<int>(std::cin));
        }
    );

    return 0;
}
5
Wojciech Migda

Vous avez besoin d'un second entier.

int i,n;
vector<int> V;
cout << "Enter the amount of numbers you want to evaluate: ";
cin >> i;
cout << "Enter your numbers to be evaluated: " << endl;
while (V.size() < i && cin >> n){
  V.Push_back(n);
}
write_vector(V);
return 0;
4
01d55

cin est délimité sur l'espace, donc si vous essayez de cin "1 2 3 4 5" dans un seul entier, si vous n'affectez que 1 à l'entier, une meilleure option consiste à envelopper votre entrée et Push_back dans une boucle, et faites-le tester pour une valeur sentinelle, et sur cette valeur sentinelle, appelez votre fonction d'écriture. tel que

int input;
cout << "Enter your numbers to be evaluated, and 10000 to quit: " << endl;
while(input != 10000) {
    cin >> input;
   V.Push_back(input);
}
write_vector(V);
3
johnathan

Vous pouvez simplement le faire avec l’aide de for loop
-> Demander à l'utilisateur l'exécution (combien d'entrées il veut entrer) et le traiter de la même façon que les tableaux.

int main() {
        int sizz,input;
        std::vector<int> vc1;

        cout<< "How many Numbers you want to enter : ";
        cin >> sizz;
        cout << "Input Data : " << endl;
        for (int i = 0; i < sizz; i++) {//for taking input form the user
            cin >> input;
            vc1.Push_back(input);
        }
        cout << "print data of vector : " << endl;
        for (int i = 0; i < sizz; i++) {
            cout << vc1[i] << endl;
        }
     }
3
Arslan Ahmad
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
    vector<string>V;
    int num;
    cin>>num;
    string input;
    while (cin>>input && num != 0) //enter any non-integer to end the loop!
{
    //cin>>input;
   V.Push_back(input);
   num--;
   if(num==0)
   {
   vector<string>::iterator it;
    for(it=V.begin();it!=V.end();it++)
        cout<<*it<<endl;
   };

}
return 0;

};
2
shiva Mirjapur

Vous voulez probablement lire plus de nombres, pas seulement un . Pour cela, vous avez besoin d’une boucle

int main()
{
  int input = 0;
  while(input != -1){
    vector<int> V;
    cout << "Enter your numbers to be evaluated: " << endl;
    cin >> input;
    V.Push_back(input);
    write_vector(V);
  }
  return 0;
}

Notez qu'avec cette version, il n'est pas possible d'ajouter le nombre -1 car il s'agit du "signal de fin" . Tapez des nombres aussi longtemps que vous le souhaitez, il sera abandonné si vous tapez -1.

2
poitroae
#include<iostream>
#include<vector>
#include<sstream>
using namespace std;

int main()
{
    vector<string> v;
    string line,t;
    getline(cin,line);
    istringstream iss(line);
    while(iss>>t)
        v.Push_back(t);

    vector<string>::iterator it;
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<endl;
    return 0;
}
1
shunbenben

Dans ce cas, votre boucle while ressemblera à 

int i = 0;
int a = 0;
while (i < n){
  cin >> a;
  V.Push_back(a);
  ++i;
}
1
Beginner

La size() initiale de V sera 0, alors que int n contient une valeur aléatoire car vous ne l'initialisez pas. 

V.size() < n est probablement faux. </ s>

Silly me manque le "Enter the amount of numbers you want to evaluate: "

Si vous entrez une n inférieure à V.size() à ce moment-là, la boucle se terminera.

1
Thom Wiggers

Ajoutez simplement une autre variable.

int temp;
while (cin >> temp && V.size() < n){
    V.Push_back(temp);
}
1
Benjamin Lindley

serait plus facile si vous spécifiez la taille du vecteur en prenant une entrée:

int main()
{
  int input,n;
  vector<int> V;
  cout<<"Enter the number of inputs: ";
  cin>>n;
  cout << "Enter your numbers to be evaluated: " << endl;
  for(int i=0;i<n;i++){
  cin >> input;
  V.Push_back(input);
  }
  write_vector(V);
  return 0;
}
0
Vivek Kumar Singh
#include<bits/stdc++.h>
using namespace std;

int main()
{
int x,n;
cin>>x;
vector<int> v;

cout<<"Enter numbers:\n";

for(int i=0;i<x;i++)
 {
  cin>>n;
  v.Push_back(n);
 }


//displaying vector contents

 for(int p : v)
 cout<<p<<" ";
}

Un moyen simple de prendre des entrées en vecteur.

0
Rohit Ranjan