【问题标题】:How to cin values into a vector如何将值转换为向量
【发布时间】:2012-01-12 17:47:54
【问题描述】:

我试图让用户输入将被推入向量的数字, 然后使用函数调用来计算这些数字。

为什么这不起作用?我只能数第一个数字。

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,要么分别读取每个变量,要么让用户用逗号分隔值,然后解析它。或者你可以在 main 方法中使用 argv 数组。
  • 您是否尝试使用其他变量?而不是同时使用 n 作为大小和临时输入。
  • 你应该解释一下这里有什么问题。
  • @R.MartinhoFernandes BenjaminLindley 我同意你们的观点,但是我认为 OP 已经花了一些时间,并且可以得到答案。当然,您的方法要好得多。

标签: c++ function templates vector cin


【解决方案1】:

按原样,您只是读取一个整数并将其推入向量中。由于您可能想要存储多个整数,因此您需要一个循环。例如,替换

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。
  • 在条件中使用 istream,例如while (cin >> input) 通过检查流的状态来评估流(或更准确地说,在这种情况下,是对操作符>>返回的流的引用),当流尝试读取 EOF 时,该状态无效,因此是评估为假。
  • 命中 EOF 会同时设置 eofbit 和 failbit。不过,我显然对将流作为条件的评估存在一些误解,您的 cmets 已引导我进行调查和清理,所以谢谢!
【解决方案2】:

其他答案会让您禁止特定数字,或告诉用户输入非数字内容以终止输入。也许更好的解决方案是使用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 开始。我该如何解决?
【解决方案3】:

你需要一个循环。这样做:

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 for(int i = 0; i &lt; inputcount; ++i) { // do your stuff here }
  • @Sean:只要让他输入任何非整数即可结束循环。例如,它可能是一个东西。 Aajikhjik1.29。它应该是非整数。为什么不进行实验,看看它是如何工作的?
【解决方案4】:

你有两个选择:

如果您知道向量的大小将是(在您的案例/示例中,您似乎知道):

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

如果你不这样做并且你不能在你的程序流程中得到它,那么:

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

【讨论】:

  • 这正是我所需要的。
【解决方案5】:

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

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

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

【讨论】:

    【解决方案6】:

    单线固定数量的数字读入向量(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;
    }
    

    【讨论】:

    • 创建一个迭代器只是为了获取单个值?糟糕的解决方案。在这种情况下std::copy_n 更好。
    【解决方案7】:

    如果你知道尺寸就用这个

    没有临时变量仅用于存储用户输入

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

    【讨论】:

      【解决方案8】:

      你需要第二个整数。

      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 个数字而不是 i+1 之后使用 cin。我必须为此使用不同类型的循环吗?
      • 第 i 个数字后面的 cin 而不是 i+1,您的意思是比这少一个输入值吗? while (cin &gt;&gt; n &amp;&amp; V.size() &lt; i-1) 会这样做。如果你想多拿一个而不是少一个,i+1 代替。不要在这里使用++-- 运算符,它们会改变i 的值。
      • 我的意思是说我输入 3 作为要评估的数字数量。程序在我输入第四个数字之前不会运行,然后它会计算出正确的数量为 3。有没有办法在输入第三个数字后启动程序。
      • while (V.size() &lt; i &amp;&amp; cin &gt;&gt; n)
      • 没问题。花几分钟查看您的问题并接受您认为最完整的答案 - 单击复选标记大纲,它将填写。
      【解决方案9】:

      您可能想要阅读更多的数字,而不仅仅是一个。 为此,您需要一个循环

      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就会中止。

      【讨论】:

        【解决方案10】:

        cin 以空格分隔,因此如果您尝试将 cin "1 2 3 4 5" 转换为单个整数,那么您只需将 1 分配给整数,更好的选择是将输入和 push_back 包装在循环,并让它测试一个标记值,然后在那个标记值上调用你的 write 函数。比如

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

        【讨论】:

          【解决方案11】:

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

          【讨论】:

            【解决方案12】:
            #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;
            
            };
            

            【讨论】:

              【解决方案13】:
              #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;
              }
              

              【讨论】:

              • 请描述您的代码的作用并对其进行修改,使其与问题的代码相匹配
              【解决方案14】:

              在这种情况下,您的 while 循环看起来像

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

              【讨论】:

                【解决方案15】:

                V 的初始 size() 将为 0,而 int n 包含任何随机值,因为您没有对其进行初始化。

                V.size() &lt; n 可能是假的。

                愚蠢的我错过了"Enter the amount of numbers you want to evaluate: "

                如果您当时输入的n 小于V.size(),则循环将终止。

                【讨论】:

                • n 被初始化为cin &gt;&gt; n
                【解决方案16】:

                只需添加另一个变量。

                int temp;
                while (cin >> temp && V.size() < n){
                    V.push_back(temp);
                }
                

                【讨论】:

                • 你忘了换一个n :)
                • @R.MartinhoFernandes:你什么意思? V.size() &lt; n?这是故意的。
                • 不应该切换条件吗?如果n == 0,您将继续等待。
                • 我修好了。你有V.push_back(n)
                【解决方案17】:
                #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<<" ";
                }
                

                一种在向量中获取输入的简单方法。

                【讨论】:

                  【解决方案18】:

                  这是我尝试过的两种方法。两者都很好用。

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

                  【讨论】:

                    【解决方案19】:

                    如果你通过输入来指定向量的大小会更容易:

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

                    【讨论】:

                      【解决方案20】:

                      我遇到了类似的问题,我就是这样做的。适当地使用 & 修改你的代码:

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

                      【讨论】:

                        猜你喜欢
                        • 2019-10-21
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-10-31
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-03-19
                        相关资源
                        最近更新 更多