istream_iterator的一点感悟
2011-08-01 21:52
211 查看
最近又来看这个《C++标准程序库》。以前大致看了容器和算法,觉得够用,现在才发现了解很甚少。于是继续加油看啊!发现自己在泛型方面的知识积累太少了,有机会一定要看一下《C++ Template》那本书啊!!C++真的是让人觉得太深了。。。
好了,现在来说一下今天遇到的问题:
一个istream迭代器,用于输入读取。一个ostream迭代器,用于输出。我想这个大家应当还是熟悉的。不过也可以和大家分享一下自己的一些用法,还是很常见的,望大家不要见笑:
上面输入的时候一定不要掉了括号哈!!
好了,现在再来说上面的程序。你会认会程序应当通过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++ //读取下一个元素,并传回迭代器指向前一个元素。
好了,现在来说一下今天遇到的问题:
#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++ //读取下一个元素,并传回迭代器指向前一个元素。
相关文章推荐
- 关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析
- 如何分析思考oralce的一些问题的一点感悟!
- 关于指针与数组的一点感悟
- 对项目开发中的一点感悟
- 4年职业生涯一点感悟
- 最近面试的一点感悟和总结
- 培养新人的一点感悟!
- 谈谈我对技术发展的一点感悟
- 从零开始学C++之STL(十):迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}
- C++中istream_iterator 与 ostream_iterator的用法
- 关于团队成员之间协作的一点感悟
- 编写工具时的一点感悟
- 五年java人的一点感悟
- MFC的一点感悟--发布日期:2007-7-24
- 关于foreach、Iterable、Iterator的一点理解
- 关于参加东创杯的一点感悟
- istream_iterator、ostream_iterator 使用初探
- 对临界区对象的一点感悟
- 编程道路上一点感悟
- qobject_cast 的一点感悟