std::istream_iterator

出自cppreference.com
 
 
迭代器庫
迭代器概念
迭代器原語
算法概念與工具
間接可調用概念
常用算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器適配器
範圍訪問
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
在標頭 <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 Traits
istream_type std::basic_istream<CharT, Traits>

要求通過從 std::iterator<std::input_iterator_tag, T, Distance, const T*, const T&> 繼承獲得成員類型 iterator_categoryvalue_typedifference_typepointerreference

(C++17 前)

成員函數

構造新的 istream_iterator
(公開成員函數) [編輯]
析構 istream_iterator,包括緩衝的值
(公開成員函數) [編輯]
返回當前元素
(公開成員函數) [編輯]
推進迭代器
(公開成員函數) [編輯]

非成員函數

(C++20 移除)
比較兩個 istream_iterator
(函數模板) [編輯]

註解

讀字符時,std::istream_iterator 默認跳過空白(除非用 std::noskipws 或等價物禁用,而 std::istreambuf_iterator 不跳過。另外,std::istreambuf_iterator 更有效率,因為它避免對每個字符構造並析構一次 sentry 對象的開銷。

示例

#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 << "\n第一个偶数是 " << *it << "。\n";
    // " 9 10" 留在流中
}

輸出:

0.1 0.3 0.6 1 
第一个偶数是 8。

缺陷報告

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

缺陷報告 應用於 出版時的行為 正確行為
P0738R2 C++98 首次讀取可以延遲到首次解引用 一定會在構造函數中進行

參閱

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