Namespaces
Variants

std::istream_iterator

ja.cppreference.net から
 
 
イテレータライブラリ
イテレータコンセプト
イテレータプリミティブ
アルゴリズムコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(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&>
(until C++17)
template< class T,
          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >
class istream_iterator;
(since C++17)

std::istream_iteratorは、T型の連続するオブジェクトを、それが構築されたstd::basic_istreamオブジェクトから、適切なoperator>>を呼び出すことによって読み取るシングルパス入力イテレータです。実際の読み取り操作は、イテレータがインクリメントされるときに行われ、デリファレンスされたときには行われません。最初のオブジェクトはイテレータが構築されたときに読み取られます。デリファレンスは、最後に読み取られたオブジェクトのコピーを返すだけです。

デフォルト構築されたstd::istream_iteratorは、end-of-streamイテレータとして知られています。有効なstd::istream_iteratorが元のストリームの終わりに達すると、end-of-streamイテレータと等しくなります。さらにデリファレンスまたはインクリメントすると、未定義動作を引き起こします。end-of-streamイテレータは、元のストリームの状態が変わっても、end-of-stream状態のままです。再代入がない限り、それ以上非end-of-streamイテレータになることはできません。

典型的なstd::istream_iteratorの実装は、2つのデータメンバを保持します:関連する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 >

メンバ型 iterator_category , value_type , difference_type , pointer および reference は、 std:: iterator < std:: input_iterator_tag , T, Distance, const T * , const T & > からの継承によって取得されることが要求される。

(C++17まで)

メンバー関数

新しい istream_iterator を構築する
(public member function)
istream_iterator を破棄する(キャッシュされた値を含む)
(public member function)
現在の要素を返す
(public member function)
イテレータを進める
(public member function)

非メンバー関数

(C++20で削除)
2つの 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++規格に対して遡及的に適用されました。

DR Applied to Behavior as published Correct behavior
P0738R2 C++98 最初の読み取りは最初のデリファレンスまで遅延される可能性がある 常にコンストラクタで実行される

関連項目

std::basic_ostreamに書き込む std::basic_ostream
(クラステンプレート)
std::basic_streambufから読み取る std::basic_streambuf
(クラステンプレート)