繁体   English   中英

当 std::istream_iterator 会发生什么<int> (std::cin) 等于结束迭代器 std::istream_iterator<int> ()

[英]What happens when std::istream_iterator<int>(std::cin) Equals to the end iterator std::istream_iterator<int>()

我正在通过检查/编写不同的示例来学习迭代器。 在一个这样的例子中(下面给出),当我在输入流中输入一个无效类型 say char ,不执行下一个cout语句。 示例如下:

#include <iostream>
#include <iterator>
int main()
{
   
    std::istream_iterator<int> starting_it(std::cin), ending_it;
   
    while(starting_it != ending_it)
    {
       
       *starting_it++;//lets say i entered the character f on the console and pressed enter then why is the next cout statement not executed
       std::cout<<"after"<<std::endl;//this line is not printed on the console after an invalid type is encountered
    }
    return 0;
}

现在,当我执行这个程序并输入值说1 2 f然后按回车键时,控制台上只打印两个“之后”。 我的问题是为什么“after”没有在屏幕上打印 3 次?

这就是我认为正在发生的事情:

第 1 步。因为在starting_itending_it不相等,所以我们进入while 循环。

第 2 步。现在, starting_it增加,同时从cin读取一个值。

第 3 步。接下来,我们将应用*运算符返回到starting_it的旧值。 这在当前迭代中具有值 1,它在语句结束时被丢弃。 下一个cout<<"after"<<std::endl; 被执行并打印在控制台上。

第 4 步。现在又一次,因为我们没有遇到文件结束或任何输入错误,所以我们进入 while 循环的下一次迭代。

Step 5. 重复Step1-Step4。 这次唯一的区别是,在 Step4 结束时,当我们取消引用starting_it我们得到了值 2。

第六步。 现在我们再次进入下一次迭代。 但是这一次当starting_it递增时,读取了一个无效的char 类型,因此starting_it等于end 迭代器。

现在我的问题是,在该步骤中,应该执行语句std::cout<<"after"<<std::endl并且应该在控制台上打印“after”。然后应该检查 while 的条件。出来是假的。 但为什么这没有发生呢? 为什么我们在控制台上只打印了两个“after”而不是 3 个。是不是因为 ostream 也出错了。 实际上,似乎每当我们在输入流上遇到错误或 eof 时,我们就会跳出 while 循环。 另外,我的解释是否正确,如果不正确,请纠正我。

我附上了输出的截图。

截屏

std::istream_iterator提前读取:构造函数中的第一次读取, operator++后续读取。 operator*返回先前读取的缓存值。 如果任何读取失败,迭代器将等于结束迭代器。

所以这就是你的例子中发生的事情。 starting_it在构造函数中读取1 循环的第一次迭代读取2并在after打印第一个。 循环的第二次迭代尝试读取f (此时starting_it ending_it变得等于ending_it )并在after打印第二个。 那么循环就存在了。

总而言之,执行了三个读取 - 一个在构造函数中,两个在两个operator++调用中,对应于打印after的两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM