iostream迭代器学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc15766228491/article/details/84850168

注:以下概念大部分来自《c++ primer 中文版》(第四版)

  1. 流迭代器主要分为两种:istream_iterator和ostream_iterator。
  2. 前者用于读取输入流,后者用于写输出流。前者用于读取输入流,后者用于写输出流。这些迭代器将他们所对应的流视为特定类型的元素序列。
  3. 流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。
  4. 流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。
  5. 流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。
  6. 两个istream可以比较迭代器是否相等(或不等)。而ostream迭代器则不提供比较运算。两个istream可以比较迭代器是否相等(或不等)。而ostream迭代器则不提供比较运算。
  7. 流迭代器都是类模板:任何已定义输入操作符(>>操作符) 的类型都可以定义istream_iterator。类似的,任何已定义输出操作符(<<操作符号)的类型也可以定义ostream_iterator。
  8. ostream_iterator 不提供超出末端迭代器。

istream_iterator 操作

将文件打开,将里面的内容放入一个vector中

#include <iostream>
#include <iterator>
#include <list>
#include <vector>
#include <algorithm>
#include <istream>
#include <fstream>
using namespace std;
ifstream& get_file(ifstream& in, const string file_path){
    in.close();
    in.clear();
    in.open(file_path);
    return in;
}
int main() {
    string file_path = "/home/****/CLionProjects/learn_C_point/if_test";
    ifstream file;
    get_file(file, file_path);
    if (!file) {
        cerr << "file open failed" << endl;
        return 0;
    }
    string term;
//    while((getline(file, term))) cout<<term<<endl;
    istream_iterator<string> in_iter(file);
    istream_iterator<string> eof; // 定义超出末端迭代器
    vector<string> vi;
    while (in_iter != eof) {
        vi.push_back(*in_iter++);
    }
    cout << "输出在vector里面的元素" << endl;
    for (auto x: vi)
        cout << x << " ";
    cout << endl;
    ///////////////////////////////////////////////////
    /* 第二种初始化vector方法 */
    get_file(file, file_path);
    if (!file) {
        cerr << "file open failed" << endl;
        return 0;
    }
    istream_iterator<string> in_iter2(file);
    vector<string> vi2(in_iter2, eof);
    cout << "输出第二个vector里面的元素" << endl;
    for (auto x: vi2)
        cout << x << " ";
    return 0;
}
输出在vector里面的元素
hello world nihao haode 
输出第二个vector里面的元素
hello world nihao haode 

ostream_iterator操作

  1. ostream_iterator 对象必须与特定的流绑定在一起
  2. ostream_iterator 不提供末端迭代器
#include <iostream>
#include <iterator>
#include <list>
#include <vector>
#include <algorithm>
#include <istream>
#include <fstream>
using namespace std;
ofstream& get_file(ofstream& out, const string file_path){
    out.close();
    out.clear();
    out.open(file_path, fstream::app);
    return out;
}
int main() {
    string file_path = "/home/baobao/CLionProjects/learn_C_point/of_test";
    ofstream file;
    get_file(file, file_path);
    if (!file) 
        cerr << "file open failed" << endl;
    vector<string> vs;
    vs.push_back("hello");
    vs.push_back("world");
    vs.push_back("nihao");
    vs.push_back("haode");
    // ostream_iterator对象必须与特定的流绑定在一起
    // 第一个参数是流,第二个参数是写入的时候的分割符号,第二个参数可选
    // 如果第一个参数是cout,则会打印在屏幕上
    ostream_iterator<string> out_iter(file, "\n");
    for (auto item = vs.begin(); item != vs.end(); item++)
        *out_iter++ = *item;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/abc15766228491/article/details/84850168