1
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 版,p403)的一个简单示例,所以我认为问题出在我身上。我已经坚持了几个小时,所以任何帮助将不胜感激。

编辑:我最初发布的代码不完整。 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;
}

吸取教训并道歉。删除这样可怕的问题是否有习惯?

4

2 回答 2

2

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

标准说[istream.iterator.cons]:

istream_iterator(istream_type& s);

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

后置条件:in_stream == &s

在这里,in_streamvalue是“仅用于展示”的成员变量,用于表明实现可能会缓冲下一个输入,可能是为了优化operator*或检查文件结尾。

于 2016-02-23T11:59:27.827 回答
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;
}

为变量使用一些有意义的名称总是值得的

于 2016-02-23T11:06:37.810 回答