【问题标题】:istream_iterator cin initialization waits for inputistream_iterator cin 初始化等待输入
【发布时间】:2023-03-10 12:17:01
【问题描述】:

我有这个代码 sn-p。 istream_iterator 对象仅被定义而不被使用,所以我希望它不会做任何事情并且应用程序会立即完成。但是当我运行应用程序时,在我提供一些输入之前它不会完成。为什么?

我在 ArchLinux 上使用:gcc 4.7.1 编译它,命令:g++ -std=c++11 filename.cpp

#include <iterator>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    istream_iterator<char> input(cin);

    return 0;
}

【问题讨论】:

  • 与 C++11 无关,所以我删除了那个标签。

标签: c++ istream-iterator


【解决方案1】:

按照标准,

24.6.1.1 istream_iterator 构造函数和析构函数 [istream.iterator.cons]

istream_iterator(istream_type& s);

3 - 效果:用&amp;s 初始化in-stream可以在构造过程中初始化,也可以在第一次被引用时初始化。

所以不确定这个程序是否会等待输入。

但是,很难看出istream_iterator 可以如何以其他方式实现;根据 24.6.1:1,在构造之后 [...] 迭代器读取并存储 T 的值,因此如果在构造时未发生读取,则需要进行读取在operator *() const 和免费的operator==(const istream_iterator&lt;T&gt; &amp;, const istream_iterator&lt;T&gt; &amp;) 上,所以迭代器的所有内部状态都必须是mutable

【讨论】:

    【解决方案2】:

    据推测,istream 迭代器将立即调用cin &gt;&gt; x 以提取第一个标记并确定它是否应该与结束迭代器相等。提取操作一直阻塞,直到流关闭、提取令牌或遇到解析失败。

    请注意,您的问题标题是错误的:您不仅声明了 input,而且还定义了它。如果您的代码要准确反映问题,它会说

    extern istream_iterator<char> input;  // declaration only!
    

    不会有阻塞。

    【讨论】:

    【解决方案3】:

    从流中,您只能“获取”每个值一次,之后它就消失了。然而,迭代器的一个常见需求是多次访问一个值而不增加迭代器。因此,istream_iterator 将在构造时提取第一个值并将其复制到一个内部值中,然后在取消引用迭代器时返回该值。 这也允许迭代器确定它是否在输入的末尾并成为结束迭代器。在递增时,然后读取下一个值。

    【讨论】:

      【解决方案4】:

      试试这个:

      #include <iostream>
      #include <iterator>
      
      using namespace std;
      
      int main()
      {
          istream_iterator<int> start(cin);
          istream_iterator<int> itend;
      
          while( start != itend ) {
              cout << *start << endl;
              start++;
              //Press Enter followed by Control-D on linux to exit the loop
          }
      
          cout<<"Control-D Pressed "<<endl;
          return 0;
      }
      
      

      【讨论】:

      • 记住它会关闭输入流。
      猜你喜欢
      • 1970-01-01
      • 2012-09-25
      • 2018-04-01
      • 2017-05-03
      • 2018-10-20
      • 2016-10-07
      • 2018-06-01
      • 2012-01-24
      • 2016-07-27
      相关资源
      最近更新 更多