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;
}
经验教训和道歉。习惯性地删除像这样的可怕问题吗?
答案 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;
}
总是为变量使用一些有意义的名称付出代价