2014-09-01 120 views
1

據我瞭解,在C++中,集裝箱類型(例如vectordequemap),我可以使用語法迭代器型像C++流迭代器VS容器迭代器

vector<int>::iterator 
map<int,int>::const_iterator 

,並得到一個實際的迭代器通過一個方法等

stuff.begin() 

然而第一元件,用於流(例如ifstream),界面似乎有點不同;我可以通過寫

streambuf_iterator<char>(fin) 
stream_iterator<int>(fin) 

從我的理解得到一個迭代器,ifstream沒有任何方法begin<int>beginbuf我最初我與vector經驗預期的方式。

他們有什麼不同(技術或歷史)的原因是什麼?如果istream迭代器的行爲更像vector之類,那麼對於新的編碼器來說,它會更加正交嗎?

+3

它主要是歷史 - 在迭代器進入圖片之前,iostreams已經使用了好幾年了。還有一個實際問題:一個矢量是通過一個類型實例化的,所以它成爲迭代器的類型。對於流,您需要直接指定您的計劃的讀/寫類型,因爲流可以保存任意類型的對象。 – 2014-09-01 03:14:29

回答

0

我認爲這裏需要注意的重要區別是您嘗試使用迭代器的結構的差異。你提到的結構,vectordequemap,是靈活的,但它們包含的數據的狀態是相對靜態的。另一方面,如果我們把它看作stream應該是的話,那麼stream是非常流暢和不斷變化的東西。

現在,因爲數據流「流動」並繼續變化,所以當將數據流視爲數據對象時,不會有流向beginend。顯然,這個觀點並不是絕對的,但我相信這將是設計stream迭代器時遵循的理念。

0

實際上流是沒有向量的。你可以想象一條河流。一條河沒有「開始」水,也沒有「結束」水(除非乾涸)。矢量更多的是一排相同的物體。該行開始和結束。

一個文件當然有一個開始和結束,但這不是流想要將文件抽象出來的方式。