c++ - 使用 std::copy 时 istream_iterator 无效

标签 c++ iterator copy stdin

我正在尝试复制一些 ints来自stdin进入vector 。我的代码可以工作,但我不确定为什么我需要 ()copy 的第二个参数之后。我的意思是 istream_iterator<int>() copy 中的参数打电话。

代码在这里...

#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> 的函数。 .

关于c++ - 使用 std::copy 时 istream_iterator 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36134503/

相关文章:

C++运算符重载<<与 vector

c++ - 访问 Google Test 参数化测试用例 (`TEST_P` 中的测试信息)

java - 使用上一个迭代器逆序列表

perl - 为什么 Perl 的 File::Copy 似乎默默地失败了?

C++:误解内存地址和指针的复制值

c++ - 如果模板类构造函数和成员函数的定义与其使用分开,则 G++ 链接器找不到它们

c++ - 无法理解赋值运算符的重载

python - 从唯一元素列表高效构建 Python 集

c++ - 在 for-each 循环中删除 vector 的一些元素而不迭代整个 vector

C++ 字符串到字节错误