[英]Using std::ifstream, std::istream_iterator and std::copy is not reading entire file
[英]istream_iterator invalid when using std::copy
我试图将一些ints
从stdin
复制到vector
。 我的代码可以工作,但是我不确定为什么在copy
的第二个参数之后需要()
。 我的意思是在copy
调用中使用istream_iterator<int>()
参数。
在这里编码...
#include <iterator>
#include <vector>
#include <iostream>
using std::vector;
using std::copy;
using std::cin;
using std::istream_iterator;
int main()
{
vector<int> nums;
copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(nums)); // why do I need the empty brackets after the 2nd argument?
return 0;
}
如果删除括号,则会从编译器中收到错误消息,但是,如果我将代码略微修改为程序下面的代码,则可以正常工作。
int main()
{
vector<int> nums;
istream_iterator<int> end; // no brackets used here
copy(istream_iterator<int>(cin), end, back_inserter(nums));
return 0;
}
我来自Java背景,所以用括号括起来就意味着您使用了一个空的构造函数。 从我对C ++的理解来看,第一个代码段与我的理解背道而驰,如果您想使用一个空的构造函数,您只会错过()
但是这里不是这种情况
救命!
线
copy(istream_iterator<int>(cin), istream_iterator<int>, back_inserter(nums));
是没有意义的。 istream_iterator<int>
是不是对象的类型。 您需要使用()
创建类型为istream_iterator<int>
的未命名,临时的,默认构造的对象。
运用
istream_iterator<int> end;
您声明了istream_iterator<int>
类型的对象,并且不需要括号,因为它是默认构造的,没有它们。 实际上,如果您使用了括号,例如:
istream_iterator<int> end();
然后,您将遇到一个最令人头疼的解析问题,并且end
现在将是一个什么都不做并返回istream_iterator<int>
的函数。
我的代码可以工作,但是我不确定为什么在第二个参数copy之后需要
()
您需要它们在适当的位置构造一个迭代器,而不是声明一个代表输入流的最后一个的单独变量。 如果你写
istream_iterator<int>
如果没有括号,则为类型名称。 使用括号是对默认构造函数的调用:
istream_iterator<int>()
一个istream_iterator<int>
对象被适当地构造,并作为第二个参数传递给std::copy
。 按照约定, istream_iterator<T>
的默认构造函数为您提供了迭代器的实例,该实例表示流的一端过去。
这可能会造成混淆,但是两种情况都默认使用构造函数创建对象。 对于第一种情况,您必须使用()
,对于第二种情况,您一定不能使用()
。
istream_iterator<int>()
默认情况下会创建一个临时对象。 如果没有()
,则istream_iterator<int>
只是类型名称,这是没有意义的,因为期望该类型的实例。
istream_iterator<int> end;
默认情况下也会创建一个命名对象。 您不能在此处使用()
,否则它将成为函数的声明,该声明不带任何参数并返回istream_iterator<int>
。 请参阅最令人讨厌的解析 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.