1、流迭代器将它们对应的流当作一个特定类型的元素序列来处理。通过使用流迭代器,我们可以用泛型算法从流对象读取数据以及向其写入数据。当创建一个流迭代器时,必须指定迭代器将要读写的对象类型。
2、istream_iterator
2.1、尾后迭代器
当我们默认初始化输入流迭代器时,就创建了一个可以当作尾后值使用的空的流迭代器,从而可以当作尾后迭代器来使用,对于一个绑定到流的迭代器,一旦其关联的流遇到文件尾或遇到 IO 错误,迭代器的值就与尾后迭代器相等。
2.2、输入流迭代器支持自增运算符 ++it,it++ 使用元素类型所定义的 >> 运算符从输入流中读取下一个值。与以往一样,前置版本返回一个指向递增后迭代器的引用,后置版本返回旧值。当然流迭代器是不支持自减运算符的,道理你懂。
2.3、实例演示(istream_iterator)
2.3.1、从流迭代器范围构造 vector
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main(void)
{
istream_iterator<int> in(cin),eof;
vector<int> vi(in, eof);
for (int i : vi) {
cout << i << ends;
}
}
输入1 2 3 4 e(流遇到e时出现io错误,迭代器与尾后迭代器相等)
输出1 2 3 4
2.3.2、算法操作流迭代器
#include <iostream>
#include <iterator>
#include <numeric>
using namespace std;
int main(void)
{
istream_iterator<int> in(cin),eof;
cout << accumulate(in, eof,0) << endl;
}
1 2 3 e
6
请按任意键继续. . .
3、ostream_iterator
3.1、我们可以对任何具有输出运算符 << 的类型定义 ostream_iterator。当创建一个 ostream_iterator 时,我们可以提供(可选的)第二参数,它是一个字符串,在输出每个元素后都会打印此字符串。此字符串必须是一个C风格字符串(即,一个字符串字面常量或者一个指向以空字符结尾的字符数组的指针)。必须将 ostream_iterator 绑定到一个指定的流,不允许空的或表示尾后位置的 ostream_iterator。
3.2、输出流迭代器存在解引用(*)自增减(++ --)运算符,但没有任何作用,每个运算符都返回它本身
3.3、实例演示(ostream_iterator)
3.3.1、
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main(void)
{
ostream_iterator<int> out(cout," ");
vector<int> vi{ 1,2,3,4 };
for (int i : vi) {
*out++ = i;
}
cout << endl;
}
1 2 3 4
请按任意键继续. . .
第10行中 * 和 ++ 对流迭代器无影响,《C++primer 5th》推荐上述写法,这样写与其他迭代器的使用保持一致,如果想改为操作其他迭代器类型,也容易修改,并且对于读者来说此写法也更清晰。
3.3.2、copy打印vec中的元素
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main(void)
{
ostream_iterator<int> out(cout," ");
vector<int> vi{ 1,2,3,4 };
copy(vi.cbegin(), vi.cend(), out);
cout << endl;
}
1 2 3 4
请按任意键继续. . .