std:: istream_iterator
| ヘッダ <iterator> で定義 |
||
| template< class T, class CharT = char, |
(C++17まで) | |
| template< class T, class CharT = char, |
(C++17以降) | |
std::istream_iterator は、構築された std::basic_istream オブジェクトから、適切な operator>> を呼び出すことによって、連続する型 T のオブジェクトを読み込むシングルパス入力イテレータです。実際の読み込み操作は、イテレータがデリファレンスされるときではなく、インクリメントされるときに実行されます。最初のオブジェクトはイテレータが構築されたときに読み込まれます。デリファレンスは、直近に読み込まれたオブジェクトのコピーのみを返します。
デフォルト構築された std::istream_iterator は、*ストリーム終端*イテレータとして知られています。有効な std::istream_iterator が基となるストリームの終端に達すると、ストリーム終端イテレータと等しくなります。それをさらにデリファレンスまたはインクリメントすると、未定義の動作が発生します。ストリーム終端イテレータは、基となるストリームの状態が変化しても、ストリーム終端状態にとどまります。再代入がない限り、ストリーム終端イテレータはそれ以上非ストリーム終端イテレータになることはありません。
std::istream_iterator の典型的な実装は、2 つのデータメンバを保持します: 関連付けられた std::basic_stream オブジェクトへのポインタと、直近に読み込まれた型 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> |
|
メンバ型 |
(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 から読み取る入力イテレータ (クラステンプレート) |