在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) << " " );
}
答案 0 :(得分:9)
in
只是typedef
的{{1}}所以示例只是在两个临时迭代器定义的“范围”上调用std::istream_iterator<int>
:std::for_each
和std::istream_iterator<int>(std::cin)
。
值初始化std::istream_iterator<int>()
只是流的通用“结束”迭代器。
istream_iterator
如何运作更加微妙。因为std::cout << (_1 * 3) << " "
来自_1
命名空间,所以它确保使用来自boost::lambda
命名空间的运算符*
和<<
,而不是{{1}直接作用于boost::lambda
的行为。这样整个表达式变为 lambda 而不是(任何部分)在operator<<
的调用站点上作为常规表达式执行。
答案 1 :(得分:4)
你在这里定义了它:
typedef std::istream_iterator<int> in;
因此in(std::cin)
是整数的迭代器,由std::for_each
使用,从 stdin (cin)读取并将它们乘以3并打印出来。
答案 2 :(得分: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
上提供一个迭代器,使用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问题,其中人们试图做类似的事情等等。