名前空間
変種
操作

std:: istream_iterator

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
Rangeアクセス
(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 は、構築された std::basic_istream オブジェクトから、適切な operator>> を呼び出すことによって、連続する型 T のオブジェクトを読み込むシングルパス入力イテレータです。実際の読み込み操作は、イテレータがデリファレンスされるときではなく、インクリメントされるときに実行されます。最初のオブジェクトはイテレータが構築されたときに読み込まれます。デリファレンスは、直近に読み込まれたオブジェクトのコピーのみを返します。

デフォルト構築された std::istream_iterator は、*ストリーム終端*イテレータとして知られています。有効な std::istream_iterator が基となるストリームの終端に達すると、ストリーム終端イテレータと等しくなります。それをさらにデリファレンスまたはインクリメントすると、未定義の動作が発生します。ストリーム終端イテレータは、基となるストリームの状態が変化しても、ストリーム終端状態にとどまります。再代入がない限り、ストリーム終端イテレータはそれ以上非ストリーム終端イテレータになることはありません。

std::istream_iterator の典型的な実装は、2 つのデータメンバを保持します: 関連付けられた std::basic_stream オブジェクトへのポインタと、直近に読み込まれた型 T の値です。

TDefaultConstructibleCopyConstructible、および 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_categoryvalue_typedifference_typepointerreference は、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 を比較します。
(function template) [編集]

[編集] 注意

文字の読み込み時、std::istream_iterator はデフォルトで空白をスキップします(std::noskipws または同等のものを使用して無効にしない限り)。一方、std::istreambuf_iterator はスキップしません。さらに、std::istreambuf_iterator は、1 文字ごとに 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 << "\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 適用対象 公開された動作 正しい動作
P0738R2 C++98 最初の読み込みは最初のデリファレンスに延期される可能性があります 常にコンストラクタで実行されます

[編集] 関連項目

std::basic_ostream に書き込む出力イテレータ
(クラステンプレート) [編集]
std::basic_streambuf から読み取る入力イテレータ
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)