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) << " " );
}
4

3 回答 3

9

in只是一个typedefforstd::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命名空间,所以它确保使用运算符*然后<<来自boost::lambda命名空间,而不是operator<<直接作用于std::ostream. 这样,整个表达式就变成了一个lambda,而不是(它的任何部分)在for_each.

于 2011-11-24T22:22:02.470 回答
4

你在这里定义了它:

typedef std::istream_iterator<int> in;

因此in(std::cin),是一个整数迭代器,由 使用,它从标准输入std::for_each(cin)读取并将它们乘以 3 并打印出来。

于 2011-11-24T22:23:17.973 回答
1

注意代码中的 typedef:

typedef std::istream_iterator<int> in;

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

std::istream_iterator<int>int接受一个流并在流中的 s 上提供一个迭代器,用于从流operator>>中读取它们。

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

我不知道你怎么可能失败。我std::istream_iterator<int>输入谷歌,第一个结果是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 问题,人们试图做类似的事情,等等......

于 2011-11-24T22:28:55.287 回答