我們知道在 C++ STL 標準庫中,流疊代器又細分為輸入流疊代器和輸出流疊代器,流緩衝區迭代器也是如此,其又被細分為輸入流緩衝區迭代器和輸出流緩衝區迭代器:在學習本節之前,讀者有必要先了解什麼是緩衝區,可閱讀《進入緩衝區(快取)的世界》一節做詳細了解。
<iterator>
標頭檔案,並位於 std 名稱空間中。因此,在建立並使用該型別疊代器之前,程式中應包含如下程式碼:#include <iterator> using namespace std;
建立輸入流緩衝區迭代器的常用方式,有以下 2 種:第二行程式碼不是必需的,但如果不用,則程式中在建立該型別的疊代器時,必須手動注明 std 名稱空間(強烈建議初學者使用)。
std::istreambuf_iterator<char> end_in;其中,<> 尖括號中用於指定從流緩衝區中讀取的字元型別。
std::istreambuf_iterator<char> in{ std::cin };除此之外,還可以傳入流緩衝區的地址,比如:
std::istreambuf_iterator<char> in {std::cin.rdbuf()};其中,rdbuf() 函數的功能是獲取指定流緩衝區的地址。
無論是傳入流緩衝區,還是傳入其地址,它們最終構造的輸入流緩衝區迭代器是一樣的。
#include <iostream> // std::cin, std::cout #include <iterator> // std::istreambuf_iterator #include <string> // std::string using namespace std; int main() { //建立結束流緩衝區迭代器 istreambuf_iterator<char> eos; //建立一個從輸入緩衝區讀取字元元素的疊代器 istreambuf_iterator<char> iit(cin); string mystring; cout << "向緩衝區輸入元素:n"; //不斷從緩衝區讀取資料,直到讀取到 EOF 流結束符 while (iit != eos) { mystring += *iit++; } cout << "string:" << mystring; return 0; }程式執行結果為:
向緩衝區輸入元素:
abc ↙
^Z ↙
string:
abc
<iterator>
標頭檔案,並位於 std 名稱空間中,因此使用該型別疊代器,程式中需要包含以下程式碼:
#include <iterator> using namespace std;
std::ostreambuf_iterator<char> out_it (std::cout);同樣,尖括號 <> 中用於指定要寫入字元的型別,可以是 char、wchar_t、char16_t 以及 char32_t 等。
std::ostreambuf_iterator<char> out_it (std::cout.rdbuf());
#include <iostream> // std::cin, std::cout #include <iterator> // std::ostreambuf_iterator #include <string> // std::string #include <algorithm> // std::copy int main() { //建立一個和輸出流緩衝區相關聯的疊代器 std::ostreambuf_iterator<char> out_it(std::cout); // stdout iterator //向輸出流緩衝區中寫入字元元素 *out_it = 'S'; *out_it = 'T'; *out_it = 'L'; //和 copy() 函數連用 std::string mystring("nhttp://c.biancheng.net/stl/"); //將 mystring 中的字串全部寫入到輸出流緩衝區中 std::copy(mystring.begin(), mystring.end(), out_it); return 0; }程式執行結果為:
STL
http://c.biancheng.net/stl/
有關 copy() 函數的具體用法,後續章節會做詳細講解。