【问题标题】:in(std::cin) : What does it mean?in(std::cin) :这是什么意思?
【发布时间】:2011-11-24 22:18:53
【问题描述】:

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

【问题讨论】:

    标签: c++ stl istream-iterator


    【解决方案1】:

    in 只是 typedefstd::istream_iterator&lt;int&gt;,因此该示例只是在两个临时迭代器定义的“范围”上调用 std::for_eachstd::istream_iterator&lt;int&gt;(std::cin)std::istream_iterator&lt;int&gt;()

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

    std::cout &lt;&lt; (_1 * 3) &lt;&lt; " " 的工作原理更加微妙。因为_1 来自boost::lambda 命名空间,它确保使用boost::lambda 命名空间中的* 运算符和&lt;&lt;,而不是直接作用于std::ostreamoperator&lt;&lt;。这样整个表达式就变成了一个lambda,而不是(它的任何部分)在for_each的调用点作为常规表达式执行。

    【讨论】:

    • 我喜欢你如何尝试在其中的一段中浓缩 lambda 的概念。我很确定,苍蝇 - 嗖嗖 - 就在 OP 的头顶上,但值得称赞的是,在这个过程中 not-failing :) +1
    【解决方案2】:

    你在这里定义的:

    typedef std::istream_iterator<int> in;
    

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

    【讨论】:

      【解决方案3】:

      注意代码中的typedef:

      typedef std::istream_iterator<int> in;
      

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

      std::istream_iterator&lt;int&gt; 接受一个流并在流中的ints 上提供一个迭代器,使用operator&gt;&gt; 从流中读取它们。

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

      我不知道你怎么可能失败。我将std::istream_iterator&lt;int&gt; 输入谷歌,第一个结果是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&gt;&gt; 而不仅仅是谈论格式化的 I/O 操作(这是 operator&gt;&gt; 所做的)。接下来是一个包含一些 C++ 示例 sn-ps 的页面,然后是几个 StackOverflow 问题,人们试图做类似的事情等等......

      【讨论】:

      • 感谢您的评论。我的意思是我找不到“in()”的任何文档。
      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 2016-10-29
      • 2013-08-17
      • 2011-09-04
      相关资源
      最近更新 更多