Как преобразовать значения в вектор

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

почему это не работает? Я могу сосчитать только первое число.

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

person Sean    schedule 04.12.2011    source источник
comment
По моему опыту, cin захватывает только первый токен в строке, поэтому все, что находится после пробела, обрезается. Если вы действительно хотите использовать cin, либо прочтите каждую переменную отдельно, либо попросите пользователя разделить значения запятой, а затем проанализировать их. Или вы можете использовать массив argv в основном методе.   -  person vince88    schedule 04.12.2011
comment
Вы пробовали использовать дополнительную переменную? Вместо использования n как для размера, так и для временного ввода.   -  person Benjamin Lindley    schedule 05.12.2011
comment
Вы должны объяснить, что здесь не работает.   -  person R. Martinho Fernandes    schedule 05.12.2011
comment
@ R.MartinhoFernandes BenjaminLindley Я согласен с вами, ребята, но я думал, что OP уже потратил некоторое время и может получить ответ. Конечно, ваш подход намного лучше.   -  person Roman Byshko    schedule 05.12.2011


Ответы (19)


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

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

с участием

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

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

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

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

person jsinger    schedule 04.12.2011
comment
operator void * не возвращает NULL для EOF, поэтому while (cin ›› input) прерывается только для недопустимого ввода, но не EOF. - person pezcode; 04.12.2011
comment
Использование istream в условии, например while (cin ›› input) оценивает поток (или, точнее, в этом случае ссылку на поток, возвращаемый оператором ››), проверяя его состояние, которое становится недействительным, когда поток пытается прочитать в EOF и, следовательно, оценивается как ложное. - person jsinger; 04.12.2011
comment
Нажатие на EOF устанавливает как eofbit, так и failbit. У меня, по-видимому, было некоторое недопонимание относительно оценки потоков как условий, однако ваши комментарии побудили меня изучить и прояснить это, так что спасибо! - person jsinger; 05.12.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));

Но это, наверное, перебор.

person Jon Purdy    schedule 04.12.2011
comment
Код - это то, что мне нужно, но он не вводит первое число с помощью cin. Таким образом, если пользователь вводит 2 3 5 6 7, число начинается с 3 в цикле while. Как мне это исправить? - person warrior_monk; 26.12.2019

Для этого вам понадобится петля. Итак, сделайте это:

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, " "));
}
person Nawaz    schedule 04.12.2011
comment
Теперь он застрял в непрерывном цикле запросов чисел. - person Sean; 04.12.2011
comment
@Sean: Нет. Введите любое нецелое число, чтобы завершить цикл! - person Nawaz; 04.12.2011
comment
если я прошу пользователя ввести определенное количество входов, как я могу остановить его после этого? - person Sean; 04.12.2011
comment
@ Шон for(int i = 0; i < inputcount; ++i) { // do your stuff here } - person greatwolf; 04.12.2011
comment
@ Шон: Просто попросите его ввести ЛЮБОЕ нецелое число, чтобы завершить цикл. Например, это могло быть что-то. A, a, jikhjik, 1.29. Оно не должно быть целым числом. Почему бы вам не поэкспериментировать и не посмотреть, как это работает? - person Nawaz; 04.12.2011
comment
@Nawaz: Это работает, как вы говорите, но как это работает? end не инициализирован; сделать конструкцию istream_iterators по умолчанию для некоторого состояния ошибки, которое соответствует другому итератору, когда есть неправильный ввод? Мне это кажется изворотливым. - person voltrevo; 05.12.2011
comment
@ Mozza314: Нет. end не неинициализирован, это класс, и вызывается конструктор по умолчанию, который его инициализировал. - person Nawaz; 05.12.2011

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

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

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

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

int helper;
while(cin>>helper){
    V.push_back(helper);
}
person H_meir    schedule 19.07.2016
comment
Это именно то, что мне нужно. - person Aryaman; 20.06.2018

Если вы знаете размер вектора, вы можете сделать это так:

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

int main() {
    int n;
    cin >> n;
    vector<int> v(n);
    for (auto &it : v) {
        cin >> it;
    }
}
person 阿尔曼    schedule 11.05.2020

Если вы знаете размер, используйте это

Временные переменные не используются только для хранения данных, введенных пользователем

int main()
{
    cout << "Hello World!\n"; 
    int n;//input size
    cin >> n;
    vector<int>a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

//to verify output user input printed below

    for (auto x : a) {
        cout << x << " ";
    }
    return 0;
}
person Amit Sharma    schedule 09.12.2019

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

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;
person 01d55    schedule 05.12.2011
comment
Работает отлично, за исключением того, что я бы предпочел, чтобы программа располагалась после i-го числа вместо i + 1. Придется ли мне для этого использовать другой тип цикла? - person Sean; 05.12.2011
comment
Под cin после i-го числа вместо i + 1 вы имели в виду, что нужно взять на одно входное значение меньше, чем это? while (cin >> n && V.size() < i-1) сделает это. Если вы хотите взять на один больше вместо одного, вместо этого i+1. Не используйте здесь операторы ++ или --, они изменят значение i. - person 01d55; 05.12.2011
comment
Я имею в виду, используя это, скажем, я ввожу 3 для количества чисел, которые нужно оценить. Программа не запустится, пока я не введу четвертое число, а затем она выдаст правильную сумму, равную 3. Есть ли способ запустить программу после ввода третьего числа. - person Sean; 05.12.2011
comment
Без проблем. Уделите несколько минут, чтобы просмотреть свои вопросы и принять ответы, которые, по вашему мнению, наиболее полные - щелкните контур галочки, и он заполнится. - person 01d55; 05.12.2011

Однострочный для считывания фиксированного количества чисел в вектор (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;
}
person Wojciech Migda    schedule 30.06.2015
comment
создать итератор только для получения единственного значения? Дерьмовое решение. std::copy_n в этом случае лучше. - person Marek R; 08.08.2018

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

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.

person poitroae    schedule 04.12.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);
person johnathan    schedule 04.12.2011

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

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;
        }
     }
person Arslan Ahmad khan    schedule 06.06.2017

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

Простой способ ввода в векторе.

person Rohit    schedule 22.07.2017

В этом случае ваш while цикл будет выглядеть так:

int i = 0;
int a = 0;
while (i < n){
  cin >> a;
  V.push_back(a);
  ++i;
}
person Roman Byshko    schedule 05.12.2011

Начальный size() для V будет 0, а int n содержит любое случайное значение, потому что вы не инициализируете его.

V.size() < n, вероятно, неверно.

Глупо я пропустил "Enter the amount of numbers you want to evaluate: "

Если в это время вы введете n, меньшее, чем V.size(), цикл завершится.

person Thom Wiggers    schedule 05.12.2011
comment
n инициализируется с помощью cin >> n. - person R. Martinho Fernandes; 05.12.2011

Просто добавьте еще одну переменную.

int temp;
while (cin >> temp && V.size() < n){
    V.push_back(temp);
}
person Benjamin Lindley    schedule 05.12.2011
comment
Вы забыли поменять n :) - person R. Martinho Fernandes; 05.12.2011
comment
@ R.MartinhoFernandes: Что ты имеешь в виду? V.size() < n? Это сделано намеренно. - person Benjamin Lindley; 05.12.2011
comment
Разве условия не следует менять? Если n == 0, ты будешь ждать. - person Roman Byshko; 05.12.2011
comment
Я починил это. У вас было V.push_back(n). - person R. Martinho Fernandes; 05.12.2011

было бы проще, если бы вы указали размер вектора, введя ввод:

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;
}
person Vivek Kumar Singh    schedule 15.10.2015

Я попробовал эти два метода. Оба подходят для использования.

int main() {
       
        int size,temp;
        cin>>size;
        vector<int> ar(size);
    //method 1 
      for(auto i=0;i<size;i++)
          {   cin>>temp;
              ar.insert(ar.begin()+i,temp);
          }
          for (auto i:ar) 
            cout <<i<<" "; 
            
     //method 2
     for(int i=0;i<size;i++)
     {
        cin>>ar[i];
     }
     
     for (auto i:ar) 
            cout <<i<<" "; 
        return 0;
    }
person r.saiprasad    schedule 16.09.2020

Я столкнулся с аналогичной проблемой, и вот как я это сделал. Правильное использование и изменение кода:

   int main()
   {
   int input;
   vector<int> V;
   cout << "Enter your numbers to be evaluated: " 
   << '\n' << "type "done" & keyboard Enter to stop entry" 
   <<   '\n';
   while ( (cin >> input) && input != "done") {
   V.push_back(input);
    }
   write_vector(V);
   return 0;
  }
   
person Mallam Awal    schedule 10.10.2020

person    schedule
comment
опишите, что делает ваш код, и измените его, чтобы он соответствовал коду вопроса - person Daniel Ruf; 27.08.2013