[英]the difference betwen `istreambuf_iterator` and `istream_iterator`
[英]C++ streams confusion: istreambuf_iterator vs istream_iterator?
istreambuf_iterator
和istream_iterator
什么區別? 一般來說,stream和streambufs有什么區別? 我真的找不到任何明確的解釋,所以決定在這里問。
IOstreams使用streambufs作為輸入/輸出的源/目標。 實際上,streambuf系列完成了有關IO的所有工作,IOstream-family僅用於格式化和字符串/字符串轉換。
現在, istream_iterator
接受一個模板參數,該參數說明了streambuf中未格式化的字符串序列應該被格式化為什么,就像istream_iterator<int>
將所有傳入的文本解釋為(空格分隔的)為int
。
另一方面, istreambuf_iterator
只關心原始字符並直接迭代它傳遞的istream
的關聯streambuf。
通常,如果您只對原始字符感興趣,請使用istreambuf_iterator
。 如果您對格式化輸入感興趣,請使用istream_iterator
。
我所說的所有內容也適用於ostream_iterator
和ostreambuf_iterator
。
這是一個非常嚴密的秘密: 本身就是一個iostream,幾乎與從計算機上的文件讀取或寫入文件無關。
iostream基本上充當streambuf和locale之間的“媒人”:
iostream存儲了一些關於如何進行轉換的狀態(例如,轉換的當前寬度和精度)。 它使用那些來指示語言環境如何以及在何處進行轉換(例如,將此數字轉換為緩沖區中寬度為8且精度為5的字符串)。
雖然你沒有直接詢問它,但是反過來的語言環境實際上只是一個容器 - 但是(相當奇怪)一個類型安全的異構容器。 它包含的東西是facet
。 構面對象定義整個區域設置的單個構面。 該標准定義了從讀取和寫入數字( num_get
, num_put
)到分類字符(ctype facet)的所有方面。
默認情況下,流將使用“C”語言環境。 這是非常基本的 - 數字只是轉換為數字流,它識別為字母的唯一內容是26個小寫字母和26個大寫英文字母,依此類推。 但是,您可以使用您選擇的不同區域設置imbue
流。 您可以選擇要在字符串中指定的名稱使用的語言環境。 一個特別有趣的是由空字符串選擇的一個。 使用空字符串基本上告訴運行時庫選擇它“認為”最適合的語言環境,通常基於用戶配置操作系統的方式。 這允許代碼以本地化格式處理數據,而無需針對任何特定語言環境明確編寫。
因此, istream_iterator
和istreambuf_iterator
之間的基本區別在於,來自istreambuf_iterator
的數據尚未完成由語言環境完成的(大部分)轉換,但來自istream_iterator
數據已由語言環境轉換。
對於它的價值,認為“大部分的”在上一段中所指的事實,當你從一個istreambuf讀取數據(通過迭代器或其他方式)基於地區的轉型的一個點點做 :隨着各種“格式化“種類的東西,語言環境包含一個codecvt facet,這是用來從一些外部表示轉換為一些內部表示(例如,UTF-8到UTF-32)。
忽略這樣一個事實可能更有意義,即它們都存儲在一個語言環境中,並且只考慮所涉及的各個方面:
這就是istream_iterator
和istreambuf_iterator
之間的真正區別。 對來自任一個的數據進行一點轉換(至少可能),但對來自istreambuf_iterator
的數據進行的轉換要少 istreambuf_iterator
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.