您的位置:首页 > 其它

istream_iterator的一点感悟

2011-08-01 21:52 211 查看
最近又来看这个《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++ //读取下一个元素,并传回迭代器指向前一个元素。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: