istream_iterator 使用 std::copy 时无效
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();
然后你将 运行 变成 most vexing parse 问题,end
现在将是一个不接受任何内容并返回 istream_iterator<int>
.
的函数
I have the code working but I'm unsure why I need the ()
after the second argument of 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;
也通过默认构造函数创建一个命名对象。这里不能用()
,否则会变成函数声明,不带参数,returnsistream_iterator<int>
。参见 Most vexing parse。
我正在尝试将一些 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();
然后你将 运行 变成 most vexing parse 问题,end
现在将是一个不接受任何内容并返回 istream_iterator<int>
.
I have the code working but I'm unsure why I need the
()
after the second argument of 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;
也通过默认构造函数创建一个命名对象。这里不能用()
,否则会变成函数声明,不带参数,returnsistream_iterator<int>
。参见 Most vexing parse。