2011-11-24 191 views
3

在Boost的第一个示例中,使用了in(std::cin)。我认为in()得到一个istream并创建某种迭代器。但是,我找不到任何详细解释它的C++文档。你能帮我找到一个吗?:这是什么意思?

这里的例子来自Boost网页复制和粘贴:

#include <boost/lambda/lambda.hpp> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    using namespace boost::lambda; 
    typedef std::istream_iterator<int> in; 
    std::for_each(
    in(std::cin), in(), std::cout << (_1 * 3) << " "); 
} 

回答

1

请注意,在代码中的typedef:

typedef std::istream_iterator<int> in; 

因此,in(...)是一样的std::istream_iterator<int>(...):它调用该类型的构造。有一个1参数的构造函数接受std::istream,创建一个代表该流中当前点的迭代器;和一个0参数的构造函数来创建一个代表任何给定流结束的迭代器。因此,std::for_each将从现在开始遍历std::cin提供的每个值,直到耗尽为止。

std::istream_iterator<int>需要一个流,并提供一个迭代器通过流中的int s,使用operator>>将它们从流中读出。

但是,我找不到任何详细解释它的C++文档。

我不知道你怎么可能失败。我将std::istream_iterator<int>放入Google,第一个结果是http://www.sgi.com/tech/stl/istream_iterator.html,这是非常彻底的,假设您已经熟悉迭代器。接下来的结果是http://www.cplusplus.com/reference/std/iterator/istream_iterator/,这是另一个尝试解释的东西,也是完全详细的。接下来是http://stdcxx.apache.org/doc/stdlibref/istream-iterator.html,类似地,最后明确提到operator>>,而不是仅仅谈论格式化的I/O操作(这是operator>>所做的)。接下来是带有一些C++示例代码片断的页面,然后是几个StackOverflow问题,其中人们试图做类似的事情等等......

+0

感谢您的评论。我的意思是我找不到“in()”的任何文档。 – iampat

9

in只是为std::istream_iterator<int>这样的例子只是由两个临时迭代器定义的“范围”,呼吁std::for_each一个typedefstd::istream_iterator<int>(std::cin)std::istream_iterator<int>()

价值初始化的istream_iterator只是一个通用的“结束”流的迭代器。

std::cout << (_1 * 3) << " "如何工作更微妙。因为_1来自boost::lambda名称空间,所以它确保使用来自boost::lambda名称空间的运算符*,然后使用<<,而不是直接在std::ostream上执行动作的operator<<。这样整个表达式就变成了lambda,而不是(它的任何部分)作为for_each的呼叫站点的常规表达式来执行。

+0

我喜欢你如何_tried_在一个段落中浓缩lambda的概念。我非常肯定,苍蝇 - 嗖嗖 - 在OP的头顶上,但尝试的荣誉,和_not-failing_在这个过程中:) +1 – sehe

+0

+1好的解释。 –

4

你这里定义它:

typedef std::istream_iterator<int> in; 

因此in(std::cin)是在整数的迭代器,通过使用std::for_each,从标准输入(CIN)读取和乘以3它们并打印出来。