std::istream_iterator
| ヘッダ <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 の一般的な実装は、紐付けられた std::basic_istream オブジェクトへのポインタと最も最近読み込んだ T 型の値の、2つのデータメンバを保持します。
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 を構築します (パブリックメンバ関数) | |
| istream_iterator (キャッシュされた値も含む) を破棄します (パブリックメンバ関数) | |
| 現在の要素を返します (パブリックメンバ関数) | |
| イテレータを進めます (パブリックメンバ関数) |
非メンバ関数
(C++20で削除) |
2つの istream_iterator を比較します (関数テンプレート) |
ノート
文字を読み込むとき、 std::istream_iterator はデフォルトでは (std::noskipws などによって無効化されない限り) ホワイトスペースをスキップし、 std::istreambuf_iterator はスキップしません。 また、 std::istreambuf_iterator は文字ごとに sentry オブジェクトを構築、破棄するオーバーヘッドを回避するため、より効率的です。
欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
| DR | 適用先 | 発行時の動作 | 正しい動作 |
|---|---|---|---|
| P0738R2 | C++98 | the first read may be deferred to the first dereferencing | the first read is performed in the constructor |
例
#include <iostream>
#include <sstream>
#include <iterator>
#include <numeric>
#include <algorithm>
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");
std::cout << "\nThe first even number is " <<
*std::find_if(std::istream_iterator<int>(str2),
std::istream_iterator<int>(),
[](int i){return i%2 == 0;})
<< ".\n";
//" 9 10" left in the stream
}
出力:
0.1 0.3 0.6 1
The first even number is 8.
関連項目
| std::basic_ostream に書き込む出力イテレータ (クラステンプレート) | |
| std::basic_streambuf から読み込む入力イテレータ (クラステンプレート) |