Sto provando a chiedere all’utente di inserire numeri che sono messi in un vettore, quindi utilizzando una chiamata di funzione per coutire i numeri, perché non funziona? Sono in grado di comporre solo il primo numero.
template void write_vector(const vector& 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 V; cout << "Enter your numbers to be evaluated: " <> input; V.push_back(input); write_vector(V); return 0; }
Com’è, stai leggendo solo in un singolo intero e spingendolo nel tuo vettore. Dato che probabilmente vuoi memorizzare diversi numeri interi, hai bisogno di un ciclo. Ad esempio, sostituire
cin >> input; V.push_back(input);
con
while (cin >> input) V.push_back(input);
Ciò che fa è continuamente tirare avanti da cin fino a quando c’è un input da afferrare; il ciclo continua fino a quando cin trova EOF o tenta di immettere un valore non intero. L’alternativa è usare un valore sentinella, anche se questo ti impedisce di inserire effettivamente quel valore. Ex:
while ((cin >> input) && input != 9999) V.push_back(input);
leggerà fino a quando non proverai ad inserire 9999 (o uno qualsiasi degli altri stati che rendono non valido il cin), a quel punto il ciclo terminerà.
Altre risposte potrebbero non consentire un determinato numero o dire all’utente di inserire qualcosa di non numerico per terminare l’input. Forse una soluzione migliore è usare std::getline()
per leggere una riga di input, quindi usare std::istringstream
per leggere tutti i numeri da quella linea nel vettore.
#include #include #include int main(int argc, char** argv) { std::string line; int number; std::vector 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); }
Inoltre, l’implementazione write_vector()
può essere sostituita con una chiamata più idiomatica all’algoritmo std::copy()
per copiare gli elementi in uno std::ostream_iterator
in std::cout
:
#include #include template void write_vector(const std::vector& vector) { std::cout << "Numbers you entered: "; std::copy(vector.begin(), vector.end(), std::ostream_iterator (std::cout, " ")); std::cout << '\n'; }
Puoi anche usare std::copy()
e un paio di utili iteratori per ottenere i valori nel vettore senza un ciclo esplicito:
std::copy(std::istream_iterator(stream), std::istream_iterator (), std::back_inserter(numbers));
Ma probabilmente è eccessivo.
Hai bisogno di un ciclo per quello. Quindi fai questo:
while (cin >> input) //enter any non-integer to end the loop! { V.push_back(input); }
Oppure usa questa versione idiomatica:
#include //for std::istream_iterator std::istream_iterator begin(std::cin), end; std::vector v(begin, end); write_vector(v);
Potresti anche migliorare il tuo write_vector
come:
#include //for std::copy template void write_vector(const vector& v) { cout << "The numbers in the vector are: " << endl; std::copy(v.begin(), v.end(), std::ostream_iterator(std::cout, " ")); }
hai 2 opzioni:
Se sai che la dimensione del vettore sarà (nel tuo caso / esempio sembra che tu lo sappia):
vector V(size) for(int i =0;i>V[i]; }
se non lo fai e non riesci a inserirlo nel stream del tuo programma, allora:
int helper; while(cin>>helper){ V.push_back(helper); }
Hai bisogno di un secondo intero.
int i,n; vector 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;
One-liner per leggere una quantità fissa di numeri in un vettore (C ++ 11):
#include #include #include #include #include int main() { const std::size_t LIMIT{5}; std::vector collection; std::generate_n(std::back_inserter(collection), LIMIT, []() { return *(std::istream_iterator (std::cin)); } ); return 0; }
cin è delimitato dallo spazio, quindi se provi a “1 2 3 4 5” in un singolo numero intero, assegnerai solo 1 al numero intero, un’opzione migliore è di avvolgere il tuo input e push_back in un ciclo, e fare test per un valore sentinella, e su quel valore sentinella, chiamare la funzione di scrittura. ad esempio
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);
Probabilmente vorrai leggere più numeri, non solo uno. Per questo, hai bisogno di un ciclo
int main() { int input = 0; while(input != -1){ vector V; cout << "Enter your numbers to be evaluated: " << endl; cin >> input; V.push_back(input); write_vector(V); } return 0; }
Nota, con questa versione, non è ansible aggiungere il numero -1 poiché è il “segnale finale”. Digita i numeri finché vuoi, verrà annullato quando digiti -1.
Puoi farlo semplicemente con l’aiuto di for loop
-> Chiedi su runtime da un utente ( quanti ingressi vuole inserire ) e lo stesso trattamento come array.
int main() { int sizz,input; std::vector 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; } }
#include #include #include using namespace std; int main() { vector 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 ::iterator it; for(it=V.begin();it!=V.end();it++) cout<<*it<
In questo caso il tuo ciclo di tempo sarà simile
int i = 0; int a = 0; while (i < n){ cin >> a; V.push_back(a); ++i; }
La size()
iniziale size()
di V
sarà 0, mentre int n contiene qualsiasi valore casuale perché non lo si inizializza.
V.size() < n
è probabilmente falso.
Sciocco mi mancava "Enter the amount of numbers you want to evaluate: "
Se inserisci un n
che è più piccolo di V.size()
in quel momento, il ciclo terminerà.
Basta aggiungere un’altra variabile.
int temp; while (cin >> temp && V.size() < n){ V.push_back(temp); }
#include #include #include using namespace std; int main() { vector v; string line,t; getline(cin,line); istringstream iss(line); while(iss>>t) v.push_back(t); vector ::iterator it; for(it=v.begin();it!=v.end();it++) cout<<*it<
sarebbe più facile se specifichi la dimensione del vettore prendendo un input:
int main() { int input,n; vector V; cout<<"Enter the number of inputs: "; cin>>n; cout << "Enter your numbers to be evaluated: " << endl; for(int i=0;i> input; V.push_back(input); } write_vector(V); return 0; }
#include using namespace std; int main() { int x,n; cin>>x; vector v; cout<<"Enter numbers:\n"; for(int i=0;i>n; v.push_back(n); } //displaying vector contents for(int p : v) cout<
Un modo semplice per prendere input nel vettore.