流迭代器读取std :: cin错过第2和第3个数字

时间:2016-02-23 10:59:43

标签: c++ vector cin istream-iterator

std::vector<int> v{};
std::istream_iterator<int> iter(std::cin), eof;

while (iter != eof) {
  v.push_back(*iter);
  ++iter;
}

执行时,该程序忽略输入标准输入的第二个和第三个整数。例如,输入1 2 3 4 5 ^Z并按Enter键会导致包含1 4 5的向量。当输入由换行符而不是空格分隔时,会发生同样的事情。

这是一个从C ++ Primer(第5版,第40页)中摘录的简单例子,所以我认为错误在于我。我已经坚持了几个小时,所以任何帮助都会非常感激。

编辑:我最初发布的代码不完整。 iter2(std::cin)iter3(std::cin)也在程序中,我认为这只是声明,但事实证明他们对丢失的输入负责。代码应该看起来像:

std::vector<int> v{};
std::istream_iterator<int> iter(std::cin), iter2(std::cin), iter3(std::cin), eof;

while (iter != eof) {
  v.push_back(*iter);
  ++iter;
}

经验教训和道歉。习惯性地删除像这样的可怕问题吗?

2 个答案:

答案 0 :(得分:2)

构造多个迭代器可能会影响结果,因为允许迭代器构造函数提前读取并缓冲下一个输入。

标准说[istream.iterator.cons]:

  

istream_iterator(istream_type& s);

     

效果:使用&s初始化 in_stream value 可以在构造期间或第一次引用时初始化。

     

后置条件:in_stream == &s

此处, in_stream value 是“仅限展示”成员变量,用于表示实现可能会缓冲下一个输入,可能会优化operator*或者检查文件结尾。

答案 1 :(得分:1)

它取消引用时应为*iter而不是*iterator

    int main()
{
    std::vector<int> v{};
    std::istream_iterator<int> iter(std::cin), eof;

    while (iter != eof) {
        v.push_back(*iter);
        ++iter;
    }

    for (int i = 0; i < v.size(); ++i)
        cout << v[i] << endl;

    return 0;
}

总是为变量使用一些有意义的名称付出代价