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&>
|
(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 > |
|
メンバ型
|
(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
(クラステンプレート) |