istream_iterator的一点感悟

        最近又来看这个《C++标准程序库》。以前大致看了容器和算法,觉得够用,现在才发现了解很甚少。于是继续加油看啊!发现自己在泛型方面的知识积累太少了,有机会一定要看一下《C++ Template》那本书啊!!C++真的是让人觉得太深了。。。

        好了,现在来说一下今天遇到的问题:

#include <iostream>
#include <iterator>

using namespace std;

int main()
{
    istream_iterator<int> intReader(cin);

    ostream_iterator<int> coutPos(cout," ");
     
    while(intReader != istream_iterator<int>())
    {
       *coutPos++ = *intReader++;
    }
}


        一个istream迭代器,用于输入读取。一个ostream迭代器,用于输出。我想这个大家应当还是熟悉的。不过也可以和大家分享一下自己的一些用法,还是很常见的,望大家不要见笑:

//输出容器元素
copy(coll.begin(), coll.end()
         ostream_iterator(cout,"  "));
//输入容器元素
//例如:
set<string> coll((istream_iterator<string>(cin)),
                 (istream_iterator<string>()));

        上面输入的时候一定不要掉了括号哈!!

         好了,现在再来说上面的程序。你会认会程序应当通过intReader(cin)读入数据,经过while()语句,当输出结束时,便退出程序。是的,当我们这样输入的时候的确是这样的。

        因为非“int”型的字符“e”在这里会导至读取失败,迭代器便会变成"end-of-stream"。那么在下面的while语句中就可以正确的结束了。

        但是当我换个输入方式:

        当输出到4的时候就停止了。这个时候需要输入一个非“int”型的值才可以退出程序。如下图:

        为什么会是在“4”这个位置呢?为什么不是在“5”后面呢?

        大家可以想一下,假如这时我们输入的数据排列如下:

        *intReader++,首先将进行后自加,但是返回的仍然是原来的值,然后进行解引用。所以当输出“1”后,intReader实际上是指向“2”的了,就这样下去。当到了“5”的时候,我们知道,这个时候先执行后自加,但是自加后这个元素并不存在!于是这个时候会读取下一个元素,于是就通过标准输入读入,因为此时我们的输入流并没有结束,还没有出成“end-of-stream”!

        所以此时我们可以输入一个字符!这个时候便会产生错误,就像上面说的那样,会生成一个“end-of-stream”,当然生成归生成。这个时候的返回还是指向“5”的,所以还是会把“5”输出。当再次进入whiel( )时条件便不符合,于是就会退出这个循环!程序也就结束了。

        当然此时我们也可以不输入字符,继续输入数字,那么这个程序就一直不会结束!!

        哈哈,这个问题就说到这里了。关键是要认真看书,注意细节。很多问题不理解就是因为不注重细节引起的,我起初不能理解就是因为我看书时遗漏了几个知识点。

      1)istream_iterator<T>()    //产生一个“end-of-stream”迭代器。

       2)iter++         //读取下一个元素,并传回迭代器指向前一个元素。

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值