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

自定義 STL 風格輸入迭代器:line_iterator 實作

     編輯:關於C語言

動機

STL 以「容器、迭代器、演算法」三位一體聞名。標準庫提供 istream_iterator 但按詞元(空白分隔)讀取,無法直接按「行」讀取。本文實作一個符合 InputIterator 概念的 line_iterator,支援 getline 語意,可直接搭配 vector、sort、copy 等演算法。

標準用法對比

原版:手動迴圈讀取

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

新版:使用 line_iterator

line_iterator begin(cin), end;           // end 為預設構造(EOF 狀態)
vector<string> v(begin, end);            // 區間構造自動讀取所有行
sort(v.begin(), v.end());
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));

line_iterator 完整實作

#include <iostream>
#include <string>
#include <iterator>

class line_iterator {
    std::istream *in;
    std::string line;
    bool is_valid;
    void read() {
        if (*in) std::getline(*in, line);
        is_valid = static_cast(*in);
    }
public:
    // Iterator traits
    using iterator_category = std::input_iterator_tag;
    using value_type        = std::string;
    using difference_type   = std::ptrdiff_t;
    using pointer           = const std::string*;
    using reference         = const std::string&;

    line_iterator() : in(&std::cin), is_valid(false) {}
    explicit line_iterator(std::istream& s) : in(&s) { read(); }

    reference operator*()  const { return line; }
    pointer   operator->() const { 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) const {
        if (in == rhs.in && is_valid == rhs.is_valid) return true;
        if (!is_valid && !rhs.is_valid) return true; // 皆為 EOF
        return false;
    }
    bool operator!=(const line_iterator& rhs) const { return !(*this == rhs); }
};

關鍵設計細節

成員用途
istream* in綁定輸入流,預設 cin
string line緩存當前行
bool is_valid標記是否成功讀取(EOF 為 false)
read()核心邏輯:嘗試 getline,更新 is_valid
Iterator traits滿足 STL 演算法對迭代器類別的靜態檢查
比較運算子雙重判斷:同流同狀態,或雙皆 EOF 視為相等

運作流程

  1. vector(begin, end) 內部循環 while (it != end) { *it; ++it; }。
  2. 每次 ++it 呼叫 read() 讀取下一行。
  3. 讀取失敗時 is_valid=false,與預設構造的 end 比較相等,循環終止。

擴充應用

  • 讀取檔案:line_iterator it(fin), end;
  • 配合 transform、find_if 等演算法處理每行。
  • 進階版可加入行號、解析 CSV 等功能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved