in(std :: cin):这是什么意思?

时间:2011-11-24 22:18:54

标签: c++ stl istream-iterator

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

3 个答案:

答案 0 :(得分:9)

in只是typedef的{​​{1}}所以示例只是在两个临时迭代器定义的“范围”上调用std::istream_iterator<int>std::for_eachstd::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问题,其中人们试图做类似的事情等等。