【发布时间】:2011-09-15 18:32:54
【问题描述】:
我是 C++ 新手,如果这是一个愚蠢的问题,我很抱歉。我似乎无法弄清楚为什么这不起作用。它复制到第一个向量中,并且似乎跳过了第二个复制调用。
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main ()
{
vector<int> first;
vector<int> second;
copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(first));
cin.clear();
copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(second));
return 0;
}
我想使用复制函数将 istream_iterator 输入读入任意数量的向量(每个向量一次调用复制)。换句话说:我希望能够在控制台中输入“1 2 3 4 5 ctrl+d”并将 1,2,3,4,5 输入到第一个向量中。然后在控制台中输入“6 7 8 9 10 ctrl+d”并将 6,7,8,9,10 输入到第二个向量中。
问题是当我在第一个向量中输入一些输入并按下 control+d 后,cin 的 istream_iterator 仍然等于 istream_iterator(),无论 cin 的失败状态如何。这会导致每次对“复制”的后续调用都失败(因为 istream_iteratorcin 已经等于程序解释为 eof 的 istream_iterator())。 所以我的问题是:我需要做什么来“重置”迭代器以及 cin 流? cin.clear() 确实清除了所有失败位。然而 istream_iterator(cin) 仍然等于 istream_iterator() 无论如何。据我了解,绑定到流的 istream_iterators 仅应在流处于失败状态时等于默认的 istream_iterator 值。我错过了什么?
【问题讨论】:
-
定义
How it should work和what is not working。 -
我正在尝试在标准输入中输入一些数字并将这些整数复制到第一个向量中,直到我按 ctrl-d 时第一个副本将停止。然后我想清除标准输入的失败状态并重复将数字复制到第二个向量的过程。问题是它复制到第一个但不复制到第二个,因为不知何故 istream_iterator
(cin) 仍然等于 istream_iterator ()。我认为清除失败状态并调用 istream_iterator (cin) 会给我一个不等于默认 istream_iterator 值的新迭代器。 -
我无法复制。我输入第一组值 ^D,输入第二组值 ^D,程序以正确的输出终止(我正在转储要检查的向量元素)。
-
卢克,真的吗??您使用的是完全相同的代码,它对您有用吗??
-
This 是我的程序的样子和我输入的内容(每行后有一个 ^D)。 Ideone 只一次性传递整个输入,所以它最终都在第一个向量中,并不代表我正在做的事情。
标签: c++ copy istream-iterator