ti-enxame.com

Como cin a um vetor

Eu estou tentando pedir ao usuário para inserir números que são colocados em um vetor, , Em seguida, usando uma chamada de função para cout os números, por que isso não está Trabalhando? Eu só sou capaz de citar o primeiro número.

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

Como está, você só está lendo em um único inteiro e o empurrando para o seu vetor. Desde que você provavelmente deseja armazenar vários inteiros, você precisa de um loop. Por exemplo, substitua

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

com

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

O que isto faz é continuamente puxar ints de cin pelo tempo que houver entrada para agarrar; o loop continua até que o cin encontre EOF ou tente inserir um valor não inteiro. A alternativa é usar um valor de sentinela, embora isso evite que você realmente insira esse valor. Ex:

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

irá ler até você tentar inserir 9999 (ou qualquer um dos outros estados que o tornam inválido), ponto em que o loop terminará.

27
jsinger

Outras respostas permitiriam que você desaprovasse um determinado número ou dissesse ao usuário para inserir algo não numérico para encerrar a entrada. Talvez uma solução melhor seja usar std::getline() para ler um line de entrada, então use std::istringstream para ler todos os números daquela linha no vetor.

#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);

}

Além disso, sua implementação de write_vector() pode ser substituída por uma chamada mais idiomática para o algoritmo std::copy() para copiar os elementos para um std::ostream_iterator para 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';
}

Você também pode usar std::copy() e alguns iteradores úteis para obter os valores no vetor sem um loop explícito:

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

Mas isso é provavelmente um exagero.

16
Jon Purdy

Você precisa de um loop para isso. Então faça isso:

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

Ou use esta versão idiomática:

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

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

Você também pode melhorar seu write_vector como:

 #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

você tem 2 opções:

Se você souber o tamanho do vetor será (no seu caso/exemplo, parece que você sabe disso):

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

se você não fizer isso e não conseguir entrar no fluxo do programa, então:

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

One-liner para ler um fixo quantidade de números em um vetor (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

Você precisa de um segundo inteiro.

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 é delimitado no espaço, então se você tentar cin "1 2 3 4 5" em um único inteiro, você só vai atribuir 1 ao inteiro, a melhor opção é envolver sua entrada e Push_back em um loop, e teste para um valor de sentinela e, nesse valor de sentinela, chame sua função de gravação. tal como

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

Você pode simplesmente fazer isso com a ajuda de para loop
-> Pergunte sobre o tempo de execução de um usuário (quantas entradas ele deseja inserir) e o mesmo tratamento como matrizes.

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

Você provavelmente vai querer ler mais números, não apenas um. Para isso, você precisa de um loop

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

Observe que, com esta versão, não é possível adicionar o número -1, pois é o "sinal final". Digite os números que desejar, ele será interrompido quando você digitar -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

Neste caso, o seu loop while será semelhante 

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

A size() inicial de V será 0, enquanto int n contém qualquer valor aleatório porque você não a inicializa. 

V.size() < n é provavelmente falso. </ s>

Tola me perdeu o "Enter the amount of numbers you want to evaluate: "

Se você digitar um n menor que V.size() naquele momento, o loop terminará.

1
Thom Wiggers

Apenas adicione outra variável.

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

seria mais fácil se você especificasse o tamanho do vetor tomando uma entrada:

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<<" ";
}

Uma maneira simples de inserir dados no vetor.

0
Rohit Ranjan