標準算法 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, " "));
實現 line_iterator,支持:
InputIterator 概念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 |
vector<string> v(iter, end_of_file) 內部循環調用 ++iter 和 iter != end_of_file++iter 觸發 read(),從流讀取一行到 line*iter 返回當前行,被拷貝進 vectorread() 設置 is_valid=false,與 end_of_file 相等,循環終止istream_iterator 理解標準庫實現