【问题标题】:cin directly to vector<int>, break loop when no more datacin 直接到vector<int>,当没有更多数据时中断循环
【发布时间】:2014-07-05 04:02:41
【问题描述】:

以下代码按原样运行并将输入存储在向量中,但会无限循环地侦听输入。目的是从输入的一行中取出一串ints,用空格分隔,并将它们存储在一个向量中。

int main(int argc, char ** argv){
    int input;
    vector<int> intVector;
    while (cin >> input) 
        intVector.push_back(input);
    //print vector contents
    copy(intVector.begin(), intVector.end(), ostream_iterator<char>(cout, " ")); cout << "\n";

    return 0;
}

我想以某种方式在 while 循环中添加一个简单的额外条件,以检查行尾,这样它就不会无限期地继续听。 cin.oef 在这里没用。我已经尝试过这个以及其他一些方法。

我可以添加一些简洁、简洁和优雅的东西来解决这个问题吗?

【问题讨论】:

标签: c++ vector cin


【解决方案1】:

怎么样

vector<int> intVector( std::istream_iterator<int>( std::cin ), 
                       std::istream_iterator<int>() );

【讨论】:

  • 不错的一个!不要忘记包含&lt;iterator&gt; 标头。
【解决方案2】:

你可以使用sstreamlib:

#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <iterator>
using namespace std;

int main(int argc, char ** argv) {

    string buf;

    while(getline(cin, buf)) {

        istringstream ssin(buf);
        vector<int> intVector;
        int input;
        while(ssin >> input) {
            intVector.push_back(input);
        }

        //print vector contents
        cout << intVector.size() << endl;
        copy(intVector.begin(), intVector.end(), ostream_iterator<int>(cout, " "));
        cout << "\n";
    }

    return 0;
}

【讨论】:

  • 这符合规范吗?输入1 2\n3 4\n 会发生什么。似乎将处理两行而不是第一行。
【解决方案3】:

如果您想避免错误,例如将字符插入整数变量,您可以这样做:

while (some condition) {
  if (!(std::cin >> int_variable)) {
    std::cin.clear();
    std::cin.ignore(1024, '\n');
  } else {
    array.push_back(int_variable);
    // Anything else or increment the condition variable
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多