BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #84721同步于 2014/12/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教一个关于STL 的问题

wanderer
2014/12/12镜像同步3 回复
问题出自C++ Standard Library- A Tutorial and Reference, 6.1.2中的一段话。作者说: std::deque<int> c((std::istream_iterator<int>(std::cin)), (std::istream_iterator<int>())); 这条语句中两个初始化参数的括号是必要的。我测试了一下去掉括号(把deque换成vector了)的情况,也就是: vector<int> c1(std::istream_iterator<int> (std::cin), std::istream_iterator<int>()); cout << c1[0]<<" "<<c1[1]<<" "<<c1[2]<<endl; 输入为:1 2 3 输出为:1 2 3 至此看来是没有问题的。 但是,如果我把cin前的std::去掉(两参数外围括号也去掉,不去掉不出问题;只去掉第二个参数的括号也没问题),既下面这段代码: vector<int> c1(std::istream_iterator<int> (cin),std::istream_iterator<int>()); cout << c1[0]<<" "<<c1[1]<<" "<<c1[2]<<" "<<c1[3]<<endl; 结果为:1 1 1 这时候结果就不对了。虽然出现问题的情况不是书上所说,估计也是一个意思。想请问一下这是什么原因?书中解释的此时第一个参数istream_iterator<int> (cin) 相当于类型为istream_iterator<int>,名称为cin,想不明白,type (name),有这么声明变量的吗?
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
gaoweiwei机器人#1 · 2014/12/12
有点意思。 type (id) 其实是等同于type id的,只不过前面那个很少有人这么写。标准里明确标明了如果 type后面的变量名带括号,可以直接把括号去掉。 这样,vector<int> c1(std::istream_iterator<int> (cin), std::istream_iterator<int>());优先匹配为一个函数声明,返回值为vector<int>,两个参数的类型是std::istream_iterator<int>和std::istream_iterator<int>()。后面那个是一个函数类型(空参数,返回值为std::istream_iterator<int>类型的函数类型)。 【 在 wanderer 的大作中提到: 】 : 问题出自C++ Standard Library- A Tutorial and Reference, 6.1.2中的一段话。作者说: : std::deque<int> c((std::istream_iterator<int>(std::cin)), (std::istream_iterator<int>())); 这条语句中两个初始化参数的括号是必要的。我测试了一下去掉括号(把deque换成vector了)的情况,也就是: : vector<int> c1(std::istream_iterator<int> (std::cin), std::istream_iterator<int>()); : ...................
wanderer机器人#2 · 2014/12/12
嗯,说的对。我刚才也试了一下,变量名声明确实可以加括号。 后面那个函数类型,无名函数?这个不太懂啊,! 【 在 gaoweiwei 的大作中提到: 】 : 有点意思。 : type (id) 其实是等同于type id的,只不过前面那个很少有人这么写。标准里明确标明了如果 type后面的变量名带括号,可以直接把括号去掉。 : 这样,vector<int> c1(std::istream_iterator<int> (std::cin), std::istream_iterator<int>());优先匹配为一个函数声明,返回值为vector<int>,两个参数的类型是std::istream_iterator<int>和std::istream_iterator<int>()。后面那个是一个函数类型(空参数,返回值为std::istream_iterator<int>类型的函数类型)。
gaoweiwei机器人#3 · 2014/12/13
typedef std::istream_iterator<int> SI; typedef std::istream_iterator<int>(*FN)(); // 函数类型 vector<int> c1(SI si, FN fn); // 一个叫c1的函数声明,它有两个参数 第二个参数不是普通的变量,而是一个函数 【 在 wanderer 的大作中提到: 】 : 嗯,说的对。我刚才也试了一下,变量名声明确实可以加括号。 : 后面那个函数类型,无名函数?这个不太懂啊,!