首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C++ 自定義輸入迭代器:line_iterator 實現與應用

     編輯:關於C

背景:STL 迭代器模式優勢

標準算法 sort、copy 配合容器和迭代器,代碼極其簡潔:

vector<string> v;
string temp;
while (getline(cin, temp)) v.push_back(temp);
sort(v.begin(), v.end());
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));

目標:將 cin 也包裝為迭代器

實現 line_iterator,支持:

  • 從輸入流逐行讀取
  • 兼容 STL 算法(如構造 vector、排序、輸出)
  • 符合 InputIterator 概念

line_iterator 完整實現

class line_iterator {
    istream* in;
    string line;
    bool is_valid;

    void read() {
        if (*in) getline(*in, line);
        is_valid = (*in) ? true : false;
    }

public:
    // InputIterator 必需類型定義
    typedef input_iterator_tag iterator_category;
    typedef string value_type;
    typedef ptrdiff_t difference_type;
    typedef const string* pointer;
    typedef const string& reference;

    // 構造函數
    line_iterator() : in(&cin), is_valid(false) {}
    line_iterator(istream& s) : in(&s) { read(); }

    // 解引用
    reference operator*() { return line; }
    pointer operator->() { return &line; }

    // 前置/後置++
    line_iterator operator++() { read(); return *this; }
    line_iterator operator++(int) { line_iterator tmp = *this; read(); return tmp; }

    // 相等比較
    bool operator==(const line_iterator& rhs) {
        if (in == rhs.in && is_valid == rhs.is_valid) return true;
        if (!is_valid && !rhs.is_valid) return true; // 兩個末尾迭代器相等
        return false;
    }
    bool operator!=(const line_iterator& rhs) { return !(*this == rhs); }
};

使用示例

int main() {
    line_iterator iter(cin);
    line_iterator end_of_file; // 默認構造綁定 cin,is_valid=false 表示結束
    vector<string> v(iter, end_of_file); // 迭代器區間構造 vector
    sort(v.begin(), v.end());
    copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
    return 0;
}

關鍵設計點解析

組件作用
read()封裝 getline,更新緩存行與有效標記
is_valid標記流狀態,兩個無效迭代器視為相等(末尾)
類型定義滿足 STL 算法對迭代器特性的靜態檢查
無參構造創建「末尾迭代器」,隱式綁定 cin

工作流程

  1. vector<string> v(iter, end_of_file) 內部循環調用 ++iter 和 iter != end_of_file
  2. ++iter 觸發 read(),從流讀取一行到 line
  3. *iter 返回當前行,被拷貝進 vector
  4. 流結束時 read() 設置 is_valid=false,與 end_of_file 相等,循環終止

擴展思路

  • 支持任意輸入流(文件、字符串流、網絡流)
  • 添加行號、解析功能
  • 結合 istream_iterator 理解標準庫實現
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved