STL与泛型编程<十二>:Stream(流)迭代器
来源:互联网 发布:成都犀牛软件培训 编辑:程序博客网 时间:2024/04/30 11:49
ostream_iterator
ostream迭代器可以将赋的值写入output stream中,它的实作机制与insert迭代器概念一致,唯一的区别在于ostream迭代器将赋值操作转换为operator<<,ostream迭代器的各个操作函数如下
其定义如下
namespace std{ template<typename T, typename charT = char, typename traits = char_traits<charT> > class ostream_iterator;}
例子如下
#include <iostream>#include <vector>#include <algorithm>#include <iterator>using namespace std;int main(void){ ostream_iterator<int> intWriter(cout,"\n"); *intWriter = 42; //42 intWriter++; //并没有什么用 *intWriter = 77; //77 intWriter++; //并没有什么用 *intWriter = -5; // -5 vector<int> col; for (int i=1; i<=9; ++i) col.push_back(i); copy(col.begin(),col.end(),ostream_iterator<int>(cout)); // 123456789 cout << endl; copy(col.begin(),col.end(),ostream_iterator<int>(cout,"<"));//1<2<3<4<5<6<7<8<9 cout << endl; return 0; }
注意
1. 输出迭代器的分隔符是const char*的,因此如果你传一个string对象进去,别忘了用c_str()成员函数以获得正确的型别,如下
string delim;...ostream_iterator<int>(cout,delim.c_str());
- ostream_iterator不提供超出末端迭代器
istream_iterator
istream迭代器用来从input stream迭代器读取元素,透过istream迭代器,算法可以从stream迭代器中直接读取数据。运用此迭代器读取元素,你需要知道区间是否已经到达终点或读取错误,为了解决这个问题,可以用end-of-stream迭代器,它可以利用istream迭代器的default构造函数生成。先看看定义
namespace std{ template<typename T, typename charT = char, typename traits = char_traits<charT>, typename Distance = ptrdiff_t> class istream_iterator;}
其各项操作见下图
如果满足以下条件,我们便说两个istream迭代器相等
1. 两者都是end-of-stream迭代器(因而不能再进行读操作),或
2. 两者都可以再进行读操作,并指向相同的stream
以下是应用例子
#include <iostream>#include <iterator>using namespace std;int main(void){ istream_iterator<int> intReader(cin); istream_iterator<int> intReaderEOF; while (intReader != intReaderEOF) //while (intReader != istream_iterator<int>())或这样写 { cout << "once : " << *intReader << endl; cout << "once again: " << *intReader << endl; ++intReader; } return 0; } /* 输入:1 2 3 f 4 输出:1 1 2 2 3 3 */
字符f的输入导致程序结束,由于格式错误,stream不再处于good状态,就和end-of-stream迭代器intReaderEOF相同,进而结束循环。
再看一个例子
#include <iostream>#include <iterator>#include <string>using namespace std;int main(void){ istream_iterator<string> cinPos(cin); ostream_iterator<string> coutPos(cout," "); while (cinPos != istream_iterator<string>()) //istream_iterator<string>()会产生一个end-of-stream迭代器 { advance(cinPos,2); if (cinPos != istream_iterator<string>()) //别忘了检查 { *coutPos++ = *cinPos++; } } cout << endl; return 0; } /* 输入:no one object if you are dong a good programming juob for someone you respect 输出: object are good for you */
总结
ostream_iterator使用方法如下
ostream_iterator<型别>(cout,delim) obj;//delim是分隔符
isteram_iterator的使用方法
istream_iterator<型别>(cin) obj;////读取while (obj != istream_iterator<型别>() )就是输入流迭代器得有个end-of-stream迭代器来标识读取结束,而这个end-of-stream迭代器一般由其默认构造函数生成
0 0
- STL与泛型编程<十二>:Stream(流)迭代器
- 泛型编程与STL
- 泛型编程与STL
- STL与泛型编程
- STL与泛型编程
- 泛型编程与STL
- 《泛型编程与stl》
- 泛型编程与STL
- STL中迭代器之流迭代器(Stream Iterator)
- hdu2072不同单词数(STL之set函数与stream流)
- 泛型编程与STL(一):iterator 迭代器
- 泛型编程与STL学习笔记之迭代器
- STL与泛型编程<八>:迭代器简介
- STL与泛型编程<九>:迭代器相关辅助函数
- STL与泛型编程<十一>:Insert(安插)迭代器
- 85 stl(十二)
- STL与泛型编程(1)---模板
- (Boolan)STL与泛型编程作业一
- C语言中的特殊转义字符
- poj-2993-Emag eht htiw Em Pleh && poj-2996-Help Me with the Game
- Spring中的@Autowired依赖注入
- b+c 模式 H5 与 Android 混合 开发详解
- 构建高并发高可用的电商平台架构实践
- STL与泛型编程<十二>:Stream(流)迭代器
- 初学的c语言一些简单的练习题(自我练习)
- 写mapreduce时的注意点
- 相似度算法
- JSTL
- Thread详解6:synchronized的使用(二)
- 设计模式-策略模式
- C#中设置console和form同时显示
- 部分高校OJ系统汇总(应该不算SEO违规吧)