【问题标题】:Push_back doesn't workPush_back 不起作用
【发布时间】:2013-08-01 23:53:52
【问题描述】:

在 Visual 2010、Visual 2012 和 CodeBlocks 上尝试过,但没有成功。在过去的 3 天里,我一直在互联网上寻找答案,但没有找到任何可以帮助我的东西。

我尝试了两种方法,第一种

    vector<int> mvec;
    int num;
    while(cin >> num)
       mvec.push_back(num);
    cout << mvec[0];

应该输出任何输入的第一个数字。相反,它什么也不做。如果我在输入数字序列之后或后面输入一个字母,它会打印第一个数字。

也试过了

    vector<int> myvector;
    int myint;

    do {
      cin >> myint;
      myvector.push_back(myint);
    } while (myint);

    cout << myvector[0];

再一次,什么都没有。我在谷歌搜索时发现了最后一个 sn-p,它显然适用于它的创建者。

一些在线编译器告诉我,例如 1 3 4 的输出是 1。我发现一个说程序正在尝试打印一个空向量

至少有人可以尝试运行其中任何一个并告诉我它们是否有效?我将在下面包含一个完整的程序。

    #include <iostream>
    #include <vector>

    int main()
    {
        using namespace std;
        vector<int> mvec;
        int num = 0;
        while(cin >> num)
            mvec.push_back(num);
        cout << mvec[0];
    }

感谢您的宝贵时间,如果这很明显,我们深表歉意。

【问题讨论】:

  • 您遇到的问题是循环永远不会退出。这是您需要做出的设计决定。您如何知道用户何时完成输入?想出那个答案,然后它应该很容易解决。

标签: c++ vector push-back


【解决方案1】:

如果您输入值

1 2 3 4

您需要以 ctrl-z (或 Unix 中的 ctrl-d )结尾,即eof 以停止输入。

我的代码运行良好(VS2012)

【讨论】:

    【解决方案2】:
    vector<int> mvec;
    int num;
    while(cin >> num)
       mvec.push_back(num);
    cout << mvec[0];
    

    只要 cin >> num 成功,循环就会继续。也就是说,只有输入一个非数字,循环才会结束,然后打印出第一个数字。

    vector<int> myvector;
    int myint;
    
    do {
      cin >> myint;
      myvector.push_back(myint);
    } while (myint);
    
    cout << myvector[0];
    

    当在预期使用布尔值的情况下使用整数时,值 0 变为假,任何其他值变为真。这个循环只会在输入 0 时停止,因为这会导致 myint 变为 false。

    我不确定你到底想做什么。如果你只想输入一个数字,不要使用循环(并且不需要向量)如果你想输入一定数量的数字,你将需要一个执行一定次数的 for 循环。

    int num;
    cout << "How many numbers do you want to enter?" << endl;
    if (! (cin >> num))
    {
        cout << "Error expected a number" << endl;
        return -1;
    }
    
    vector<int> vec;
    for (int i = 0; i < num; i++)
    {
        int x;
        if (! (cin >> x))
            {
            cout << "Error expected a number" << endl;
            return -1;
        }
        vec.push_back(x);
    }
    
    for (int i = 0; i < vec.size(); i++)
    {
        cout << "number entered: " << vec[i] << endl;
    }
    

    【讨论】:

      【解决方案3】:

      您最终需要输入 0 才能跳出循环。所以 1 3 4 0 会得到 1。但是你永远不能使用这种方法在向量中输入 0。向量中只有 [1, 3, 4]。

      【讨论】:

      • 这适用于问题中的第二个代码 sn-p(带有do ... while (myint) 的那个)
      【解决方案4】:

      首先,push_back 没有任何问题。 :)

      您希望如何终止while( cin &gt;&gt; num ) 循环?看起来您使用的是 Windows,所以 &lt;Ctrl-Z&gt; 会导致 cin 无效,因此终止 while 循环。在类似 Un*x 的系统上,它是 &lt;Ctrl-D&gt;

      输入字母终止循环的原因是cin 试图将结果放入数字变量中,并且无法将字符串解析为数字。

      你的程序适合我。

      (注意:输入0 不会终止循环)。

      【讨论】:

        【解决方案5】:

        Bjarne Stroustrup 在他的网站上有一个 std::vector 和 push_back 的示例:

        http://www.stroustrup.com/bs_faq2.html#simple-program

        #include<iostream>
        #include<vector>
        #include<algorithm>
        #include<string>
        using namespace std;
        
        int main()
        {
            vector<double> v;
        
            double d;
            while(cin>>d) v.push_back(d);   // read elements
            if (!cin.eof()) {       // check if input failed
                cin.clear();        // clear error state
                string s;
                cin >> s;       // look for terminator string
                if (s != "end") {
                    cerr << "format error\n";
                    return 1;   // error return
                }
            }
        
            cout << "read " << v.size() << " elements\n";
        
            reverse(v.begin(),v.end());
            cout << "elements in reverse order:\n";
            for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n';
        
            return 0; // success return
        }
        

        您只需输入以空格分隔的数字,完成后输入 end

        它对初学者有好处,因为它不依赖于不同操作系统的可变文件结尾字符。

        【讨论】:

          【解决方案6】:

          您的标准输出缓冲区可能没有刷新。试试这个:

          cout << myVec[0] << flush;
          

          或者这个:

          cout << myVec[0] << endl;
          

          【讨论】:

          • std::coutmain 返回时会被刷新。
          猜你喜欢
          • 1970-01-01
          • 2014-05-27
          • 2014-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-06
          • 1970-01-01
          相关资源
          最近更新 更多