这篇文章基于C++primer,参考的
流迭代器是啥
简单理解就是迭代器会把不同流看作特定类型对象的序列
比如: 感觉和迭代器操作容器是一样的,我感觉也是,先这样理解吧,用着用着就会有了更深刻的理解了。
概述
先要记住: istream_iterator 读取输入流 ostream_iterator 向输出流写数据
istream_iterator
当创建流迭代器时,必须指定读取的对象的类型; 当使用默认初始化时,我们相当于创建了一个尾后迭代器(相当于 end()) ,这就是一个流对象序列的 起与终 我们要知道 流迭代器使用 流提取运算符 >>,来读取流。也就是说,我们可以用自定义类型使用流迭代器,前提要重载 >>
istream_iterator < int >num(cin) //从cin 读取int数据 istream_iterator< int >obj 尾后迭代器 istream_iterator< string> str(file_name)// 从文件读取string 数据
先来看一下代码:
#include<vector>
using std::vector;
#include<iostream>
using std::cin; using std::cout; using std::endl;
#include<iterator>
using std::istream_iterator;using std::ostream_iterator;
int main() {
vector<int> vec;
istream_iterator<int> in_iter(cin);
istream_iterator<int> eof;
while (in_iter != eof)
vec.push_back(*in_iter++);
ostream_iterator<int> out_iter(cout, " ");
for (auto e : vec)
out_iter = e;
cout << endl;
return 0;
}
这段代码的意思是 从标准输(cin)入读取数据,在将其存入动态数组里, 在将其写入(cout)到标准输出。
代码体现了一般迭代器的用法:解引用,递增 以下体现了具体用法 (图牌来源:c++primer,目的:方便复习。) 对于一个绑定到流的迭代器,一旦其关联的流遇到文件结尾或者IO错误,迭代器的值就与尾后的迭代器相等。
我们还可以利用容器的迭代器范围初始化来初始化容器: 我们先创建一个文件,使用文件流,内容为: 现在可以通过流迭代器初始化容器了
#include<iostream>
#include<fstream>
#include<string>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int count=0;
ifstream in;
in.open("a_file.txt");
if(in.fail())cout<<"can't open file!"<<endl;
istream_iterator<string>str_it(in);
istream_iterator<string>eof;
vector<string>vec(str_it,eof);
in.close();
for_each(vec.begin(),vec.end(),[&](string s){cout<<s<<" ";++count;if(count%2==0)cout<<endl; });
return 0;
}
输出为: 与我们的文件内容一样,确实很方便有高效。
ostream_iterator
我们可以对定义了 << (插入运算符)的类型,使用 ostream_iterator 迭代器 必须指定输出对象的类型。它还接受第二个参数(可选),使用个子符串,每次输出,都要打印这个字符串。 以下体现了具体用法 (图牌来源:c++primer,目的:方便复习。) 其实解引用 * 或者 递增 ++ ,对这个迭代器无用,要想输出值 只需使用 = , 将要输出的绑定到 赋值号左边的对象输出即可。
小技巧: 1, 使用 copy 来遍历容器:
#include<iostream>
#include<fstream>
#include<string>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
vector<string>vec{"hello","vector","ostream_iterator","iterator"};
ostream_iterator<string>ost(cout," \n");
copy(vec.begin(),vec.end(),ost);
return 0;
}
2,使用 accumulate 来对标准输入的值求和
#include<iostream>
#include<string>
#include<iterator>
#include<vector>
#include<algorithm>
#include<numeric>
using namespace std;
int main(){
istream_iterator<int>in(cin),eof;
ostream_iterator<int>out(cout);
out=accumulate(in,eof,0);
return 0;
}
好了,知识就到这里了。
|