Как скрутить с вектором - PullRequest
       35

Как скрутить с вектором

34 голосов
/ 04 декабря 2011

Я пытаюсь попросить пользователя ввести числа, которые вставляются в вектор, а затем с помощью вызова функции вычислить числа, почему это не работает?Я могу набрать только первый номер.

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

Ответы [ 16 ]

27 голосов
/ 04 декабря 2011

Как есть, вы читаете только одно целое число и помещаете его в свой вектор. Поскольку вы, вероятно, хотите хранить несколько целых чисел, вам нужен цикл. Например, заменить

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

с

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

То, что это делает, это постоянно извлекает целые числа из cin до тех пор, пока есть входные данные для захвата; цикл продолжается до тех пор, пока cin не найдет EOF или не попытается ввести нецелое значение. Альтернативой является использование значения часового, хотя это не позволяет вам фактически ввести это значение. Пример:

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

будет считываться до тех пор, пока вы не попытаетесь ввести 9999 (или любое из других состояний, которые делают cin недействительным), после чего цикл завершится.

18 голосов
/ 04 декабря 2011

В других ответах вы бы запретили определенное число или сказали бы пользователю вводить что-то нечисловое для прекращения ввода. Возможно, лучшим решением будет использование std::getline() для чтения строки ввода, а затем использование std::istringstream для чтения всех чисел из этой строки в вектор.

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

}

Кроме того, ваша реализация write_vector() может быть заменена более идиоматическим вызовом алгоритма std::copy() для копирования элементов в 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';
}

Вы также можете использовать std::copy() и несколько удобных итераторов, чтобы получить значения в векторе без явного цикла:

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

Но это, вероятно, излишне.

12 голосов
/ 04 декабря 2011

Вам нужен цикл для этого.Так что сделайте это:

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

Или используйте эту идиоматическую версию:

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

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

Вы также можете улучшить свой write_vector как:

 #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, " "));
}
8 голосов
/ 19 июля 2016

у вас есть 2 варианта:

Если вы знаете, что размер вектора будет (в вашем случае / примере, кажется, вы это знаете):

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

, если вы этого не сделаетеи тогда вы не сможете получить его в своем программном потоке:

int helper;
while(cin>>helper){
    V.push_back(helper);
}
5 голосов
/ 30 июня 2015

Однострочный для чтения фиксированного количества чисел в векторе (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;
}
4 голосов
/ 05 декабря 2011

Вам нужно второе целое число.

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;
3 голосов
/ 06 июня 2017

Вы можете просто сделать это с помощью для цикла
-> Спросить пользователя во время выполнения (, сколько входных данных он хочет ввести ) и обработать то же самое, что и массивы.

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 голосов
/ 04 декабря 2011

cin ограничен пробелом, поэтому, если вы попытаетесь cin "1 2 3 4 5" в одно целое число, вам нужно будет только присвоить 1 целому числу, лучший вариант - обернуть ввод и push_back в зациклите, и пусть он проверит на значение дозорного, и для этого дозорного значения вызовите вашу функцию записи. такие как

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);
2 голосов
/ 19 июня 2017
#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 голосов
/ 04 декабря 2011

Вы, вероятно, хотите читать больше цифр, а не только одну. Для этого вам понадобится петля

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

Обратите внимание, что в этой версии невозможно добавить число -1, поскольку это "сигнал окончания". Набирайте числа сколько угодно, оно будет прервано при вводе -1. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...