最近又来看这个《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++ //读取下一个元素,并传回迭代器指向前一个元素。