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_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 > |
|
メンバ型
|
(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 最初の偶数は 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
(クラステンプレート) |