如何将值输入到向量(vector)中

64
我正在尝试要求用户输入数字并将其推入向量中,然后使用函数调用来计算这些数字。为什么这不起作用?我只能计算第一个数字。
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;
}

根据我的经验,cin只能捕获字符串中的第一个标记,所以空格后面的任何内容都会被截断。如果你真的想使用cin,要么逐个读取每个变量,要么让用户用逗号分隔值,然后解析它。或者你可以在主方法中使用argv数组。 - vince88
3
你尝试使用另一个变量吗?不要像之前一样同时用 n 表示大小和临时输入。 - Benjamin Lindley
3
你应该解释这里出了什么问题。 - R. Martinho Fernandes
@R.MartinhoFernandes BenjaminLindley,我同意你们的看法,但是我认为OP已经花了一些时间,可以得到答案。当然,你们的方法更好。 - Roman Byshko
22个回答

49

目前你只读取了一个整数并将其推入向量中。由于你可能想要存储多个整数,所以需要使用循环。例如,替换为:

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无效的状态),此时循环将终止。


operator void* 不会为 EOF 返回 NULL,因此 while (cin >> input) 只会在输入无效时中止,而不是在 EOF 时中止。 - pezcode
2
使用 istream 在条件语句中,例如 while (cin >> input),通过检查其状态来评估流(或更准确地说,在此情况下由 operator>> 返回的流引用),当流尝试读取 EOF 时,其状态将变为无效,因此被评估为 false。 - jsinger
1
遇到EOF时会同时设置eofbit和failbit。不过,显然我对于流作为条件的评估有些误解,你的评论引导我进行了调查和澄清,所以谢谢! - jsinger

22

你需要使用循环来实现。所以做以下操作:

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

现在它卡在了一个不断询问数字的循环中。 - Sean
@Sean:不行。输入任何非整数以结束循环! - Nawaz
1
@Sean for(int i = 0; i < inputcount; ++i) { // 在这里编写你的代码 } - greatwolf
@Sean:让他输入任何非整数以结束循环。例如,可以是任何东西。Aajikhjik1.29。它应该是非整数。为什么不试一试,看看它是如何工作的? - Nawaz
@Nawaz:它按照您所说的方式工作,但是它是如何工作的呢? end 是未初始化的;istream_iterator 是否默认构造为某些错误状态,而另一个迭代器在存在错误输入时与之匹配?这对我来说似乎有些不可靠。 - voltrevo
显示剩余2条评论

21

其他答案可能会让您禁止特定数字,或者告诉用户输入非数字以终止输入。也许更好的解决方案是使用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_iteratorstd::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));

但那可能太过复杂了。


代码是我需要的,但它没有使用cin输入第一个数字。因此,如果用户输入2 3 5 6 7,则while循环中的数字从3开始。我该如何解决这个问题? - warrior_monk

14

你有两个选择:

如果您知道向量的大小(在您的情况/示例中似乎您知道它):

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

如果您的程序流程中没有相关内容或无法获取,请执行以下操作:

int helper;
while(cin>>helper){
    V.push_back(helper);
}

这正是我所需要的。 - Aryaman

10

如果你知道向量的大小,你可以像这样做:

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

int main() {
    int n;
    cin >> n;
    vector<int> v(n);
    for (auto &it : v) {
        cin >> it;
    }
}

5

一行代码读取固定数量的数字并存储到向量中(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;
}

1
创建一个迭代器只是为了获取单个值?这是一个糟糕的解决方案。在这种情况下,std::copy_n 更好。 - Marek R

5

如果您知道尺寸,请使用此选项。

不使用临时变量来存储用户输入

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

4
你需要一个第二个整数。
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;

除了我更喜欢程序在第i个数字后使用cin,而不是i+1之外,它完美地工作。我需要使用不同类型的循环吗? - Sean
通过在第i个数字后使用cin,而不是i+1,你的意思是要少输入一个值吗?while (cin >> n && V.size() < i-1)可以实现这一点。如果你想多输入一个值而不是少输入一个值,就用i+1代替。不要在这里使用++--运算符,因为它们会改变i的值。 - 01d55
我是说,通过使用这个程序,我输入3作为要评估的数字数量。在我输入第四个数字之前,程序不会运行,然后它将输出正确的数量为3。有没有一种方法在输入第三个数字后启动程序。 - Sean
while (V.size() < i && cin >> n) - 01d55
1
没问题。花几分钟时间仔细查看你的问题,并接受你认为最完整的答案 - 点击勾号轮廓,它会填充。 - 01d55

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

};

3

您可以使用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;
        }
     }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接