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迭代器一般由其默认构造函数生成