C++ STL 學習日記(二)

迭代器

迭代器是算法和容器的”中間人“。在STL中容器是封裝起來的類,其內部結構無法知曉,而只能通過容器接口來使用容器。但是STL算法是通用算法,其並不會專門針對某一個容器類型。算法要適用於多種容器,而種容器可以存放各種數據,這時只能使用一種更抽象的”指針“來充當中介,這個”指針“便是迭代器。

頭文件<iterator>。

輸入流迭代器

輸入流迭代器用來從一個輸入流中連續的輸入某種類型的數據,他是一個類模板

例如:

template<class T>istream_iterator<T>;

其中T是輸入流中輸入數據的類型。類型T要滿足兩個條件:有默認構造函數;對該類型可以使用”>>“從輸入流輸入。

一個輸入流迭代器需要由下面的構造函數來構造:

istream_iterator(istream & in);

 在該構造函數中,需要提供用來輸入數據的輸入流(例如:cin)作爲參數。

輸入流迭代器實例支持”*“、”->“、”++“等幾種運算符。用”*“可以訪問剛剛讀取的元素;用”++“可以從輸入流中讀取下一個元素;若類型T是類類型或結構類型,用”->“可以訪問剛剛讀取的元素的成員。

如何判斷輸入流是否已經結束?istream_iterator類模板有一個默認構造函數,用該構造函數構造出的迭代器就是輸入流的結束位置,將一個輸入流與這個迭代器進行比較就可以判斷是否結束。

輸出流迭代器

輸出流迭代器用來向一個輸出流連續輸出某種類型的數據,他也是一個類模板。

例如:

template<class T>ostream_iterator<T>;

其中T是輸入流中輸入數據的類型,類型T要具有一個功能,對該類型的數據可以使用"<<"向輸出流輸出。

一個輸出流迭代器由以下兩個構造函數構造:

ostream_iterator(ostream& out);
ostream_iterator(ostream& out,const char* delimiter);

 構造函數中的參數out表示將數據輸出到的輸出流。參數delimiter是可選的,表示兩個輸出數據之間的分隔符。

輸出流迭代器也支持”*“運算符,但是對於一個輸出迭代器iter,*iter只能作爲賦值運算的左側值。例如:*iter=x,這相當於執行了out<<x或者out<<x<<delimiter。

輸出流迭代器也支持"++"運算符,但是實際上並不會是該迭代器的狀態發生變化,支持”++“運算只是爲了讓他和其他迭代器有統一的接口。

前向迭代器

前向迭代器這一概念是輸入迭代器和數輸入迭代器的子概念,它既支持數據讀取也支持數據寫入。

前向迭代器支持對序列進行重複的單向遍歷。

雙向迭代器

雙向迭代器是前向迭代器的子概念。在單向迭代器所支持的功能基礎上,他又支持向反向移動。

隨機訪問迭代器

隨機訪問迭代器是雙向迭代器的子概念。在雙向迭代器的基礎上,他又支持直接將迭代器向前或向後移動n個元素,因此隨機訪問迭代器功能幾乎和指針一樣。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章