STL中istream_iterator和ostream_iterator的基本用法

標準程序庫定義有供輸入及輸出用的iostream iterator類,稱爲istream_iterator和ostream_iterator,分別支持單一型別的元素讀取和寫入。使用這兩個iteratorclasses以前,先得含入iterator頭文件:
linux

#include<iterator>
如今讓咱們看看如何利用istream_iterator從標準輸人裝置中讀取字符串(即相似cin功能):

就像全部的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, " " );
上述第二個參數能夠是C-Sty1e字符串,也能夠是字符串常量。它用來表示各個元素被輸出時的分隔符,默認情形下輸出的各個元素並沒有任何分隔符。本例我選擇在各輸出字符串之間以空白加以分隔。如下即是可能的運用方式:
copy( text.begin(), text.end(), os );

copy()會將存儲在text中的每一個元素一一寫到由os所表示的ostream上頭,每一個元素皆以空格符分隔開來。

完整示例代碼以下:字符串

#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

image

特別說明:輸入的時候怎樣結束輸入呢?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;
}
相關文章
相關標籤/搜索