繁体   English   中英

使用std :: copy时istream_iterator无效

[英]istream_iterator invalid when using std::copy

我试图将一些intsstdin复制到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM