名稱空間
變體
操作

std::istream_iterator

來自 cppreference.com
 
 
迭代器庫
迭代器概念
迭代器原語
演算法概念與工具
間接可呼叫概念
常用演算法要求
工具
迭代器介面卡
 
 
定義於標頭檔案 <iterator>
template< class T,

          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >
class istream_iterator

    : public std::iterator<std::input_iterator_tag, T, Distance, const T*, const T&>
(C++17 前)
template< class T,

          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >

class istream_iterator;
(C++17 起)

std::istream_iterator 是一個單通道輸入迭代器,它透過呼叫適當的 operator>> 從它所構造的 std::basic_istream 物件中讀取連續的 T 型別物件。實際的讀取操作在迭代器遞增時執行,而不是在解引用時執行。第一個物件在迭代器構造時讀取。解引用只返回最近讀取物件的副本。

預設構造的 std::istream_iterator 被稱為流結束迭代器。當一個有效的 std::istream_iterator 到達底層流的末尾時,它會變得與流結束迭代器相等。進一步解引用或遞增它將導致未定義行為。即使底層流狀態改變,流結束迭代器也保持在流結束狀態。如果沒有重新賦值,它不能再成為非流結束迭代器。

std::istream_iterator 的典型實現包含兩個資料成員:一個指向相關聯的 std::basic_istream 物件的指標,以及最近讀取的 T 型別值。

T 必須滿足 DefaultConstructible(預設可構造)、CopyConstructible(可複製構造)和 CopyAssignable(可複製賦值)要求。

目錄

[編輯] 成員型別

成員型別 定義
iterator_category std::input_iterator_tag
value_type T
difference_type Distance
pointer const T*
reference const T&
char_type CharT
traits_type 特性
istream_type std::basic_istream<CharT, Traits>

成員型別 iterator_categoryvalue_typedifference_typepointerreference 需要透過繼承自 std::iterator<std::input_iterator_tag, T, Distance, const T*, const T&> 來獲取。

(C++17 前)

[編輯] 成員函式

構造一個新的 istream_iterator
(公共成員函式) [編輯]
析構一個 istream_iterator,包括快取值
(公共成員函式) [編輯]
返回當前元素
(公共成員函式) [編輯]
前進迭代器
(公共成員函式) [編輯]

[編輯] 非成員函式

比較兩個 istream_iterator
(函式模板) [編輯]

[編輯] 注意

讀取字元時,std::istream_iterator 預設跳過空白(除非透過 std::noskipws 或等效方式停用),而 std::istreambuf_iterator 則不跳過。此外,std::istreambuf_iterator 更高效,因為它避免了每個字元構造和析構哨兵物件的開銷。

[編輯] 示例

#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <sstream>
 
int main()
{
    std::istringstream str("0.1 0.2 0.3 0.4");
    std::partial_sum(std::istream_iterator<double>(str),
                     std::istream_iterator<double>(),
                     std::ostream_iterator<double>(std::cout, " "));
 
    std::istringstream str2("1 3 5 7 8 9 10");
    auto it = std::find_if(std::istream_iterator<int>(str2),
                           std::istream_iterator<int>(),
                           [](int i){ return i % 2 == 0; });
 
    if (it != std::istream_iterator<int>())
        std::cout << "\nThe first even number is " << *it << ".\n";
    //" 9 10" left in the stream
}

輸出

0.1 0.3 0.6 1 
The first even number is 8.

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
P0738R2 C++98 第一次讀取可能會推遲到第一次解引用 總是在建構函式中執行

[編輯] 另請參閱

寫入std::basic_ostream的輸出迭代器
(類模板) [編輯]
std::basic_streambuf讀取的輸入迭代器
(類模板) [編輯]