標準程序庫定義有供輸入及輸出用的iostream iterator類,稱爲istream_iterator和ostream_iterator,分別支持單一型別的元素讀取和寫入。使用這兩個iteratorclasses以前,先得含入iterator頭文件:
linux
#include<iterator>
就像全部的iterators同樣咱們須要一對iterators:first和last,用來標示元素範圍。這裏想象一下istream_iterator的起始位置和結束位置分別是什麼。ios
下面這行代碼爲咱們提供了一個firstiterator,它將is定義爲一個「連結至標準輸人裝置(cin)」的istream_iterator。算法
istream_iterator<string> is( cin);
咱們還須要一個lastiterator,表示「欲讀取之最後元素的下一位置」。spa
對標準輸入裝置而言,end-of-file即表明last。這該如何表示呢?噢,只要在定義istreamiterator時不爲它指定istream對象,它便表明了end-of-file。以下所示:code
istream_iterator<string> eof;
咱們應該如何使用這對iterators呢?下面的例子中,我將它們,以及存儲字符串元素的vector一塊兒傳給泛型算法。copy()因爲不知道要爲vector保留多少空間,因此我選用back_inserter:對象
copy( is, eof, back_inserter( text ));
說明一下:back_inserter 是iterator適配器,它使得元素被插入到做爲實參的某種容器的尾部,如vector等blog
如今我還須要一個ostream_iterator表示字符串元素的輸出位置。如下程序代碼將os定義爲一個「連結至標準輸出設備」的ostream_iterator,此標準輸出設備供咱們輸出型別爲string的元素。
ci
ostream_iterator<string> os( cout, " " );
copy( text.begin(), text.end(), os );
完整示例代碼以下:字符串
#include<iostream> #include<string> #include<iterator> #include<algorithm> using namespace std; int main() { string text; istream_iterator<int> is(cin);//綁定標準輸入裝置 istream_iterator<int> eof;//定義輸入結束位置 copy(is,eof,back_inserter(text)); sort(text.begin(),text.end()); ostream_iterator<int> os(cout,", ");//綁定標準輸出裝置 copy(text.begin(),text.end(),os); }
運行結果:get
特別說明:輸入的時候怎樣結束輸入呢?win下 ctrl+z;linux下 ctrl+d 。
然而,經常,咱們並非要從標準輸人設備中讀數據,也不是要寫到標準輸出設備中去,而是但願從文件中讀取,寫到文件中去。這該如何辦到?啊,只需將istream_iterator綁定至ifstreamobject,將ostream_iterator綁定至ofstream object便可:
#include <iostream> #include <fstream> #include <iterator> #include <algorithm> #include <vector> #include <string> using namespace std; int main() { ifstream in_file("input_file.txt"); ofstream out_file("output_file.txt"); if(!in_file || !out_file) { cout<<"filesopen failed!\n"; return -1; } istream_iterator<string> is(in_file); istream_iterator<string> eof; vector<string> text; copy(is,eof,back_inserter(text)); sort(text.begin(),text.end()); ostream_iterator<string> os(out_file," "); copy(text.begin(),text.end(),os); return 0; }