Namespaces
Variants

std::istreambuf_iterator

ja.cppreference.net より
 
 
イテレータライブラリ
イテレータコンセプト
イテレータプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
範囲アクセス
(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 CharT, class Traits = std::char_traits<CharT> >
class istreambuf_iterator
    : public std::iterator<std::input_iterator_tag,
                           CharT, typename Traits::off_type,
                           /* unspecified */, CharT>
(C++17まで)
template< class CharT, class Traits = std::char_traits<CharT> >
class istreambuf_iterator;
(C++17から)

std::istreambuf_iterator は、構築時に指定された std::basic_streambuf オブジェクトから連続する文字を読み取るシングルパス入力イテレータです。

デフォルト構築された std::istreambuf_iterator は ストリーム終端 イテレータと呼ばれます。std::istreambuf_iterator が基盤となるストリームの終端に達すると、ストリーム終端イテレータと等しくなります。それをさらにデリファレンスまたはインクリメントすると、未定義動作を引き起こします。

std::istreambuf_iterator は、トリビアルなコピーコンストラクタ、constexpr デフォルトコンストラクタ、およびトリビアルなデストラクタを持ちます。

(C++11から)

メンバー型

メンバー型 定義
iterator_category std:: input_iterator_tag
value_type CharT
difference_type typename Traits :: off_type
pointer /* unspecified */
reference CharT
char_type CharT
traits_type Traits
int_type typename Traits :: int_type
streambuf_type std:: basic_streambuf < CharT, Traits >
istream_type std:: basic_istream < CharT, Traits >
/* proxy */ 実装定義のクラス型。
proxy オブジェクトは char_type 文字と streambuf_type* ポインタを保持する。
proxy オブジェクトを operator* でデリファレンスすると、格納された文字が得られる。
( 説明専用メンバー型* )

メンバ型 iterator_category , value_type , difference_type , pointer および reference は、 std:: iterator < std:: input_iterator_tag , CharT, typename Traits :: off_type , /* unspecified */ , CharT > からの継承によって取得されることが要求される。

(C++17まで)

メンバ型 pointer は通常 CharT* です( 下記 を参照)。

メンバー関数

新しい istreambuf_iterator を構築する
(public member function)
(destructor)
(implicitly declared)
istreambuf_iterator を破棄する
(public member function)
現在の文字のコピーを取得する
(public member function)
イテレータを進める
(public member function)
両方の istreambuf_iterator がストリーム終端か、または両方が有効であるかをテストする
(public member function)

非メンバー関数

(C++20で削除)
二つの istreambuf_iterator を比較する
(関数テンプレート)

注記

LWG issue 659の解決により、 LWG issue 659 で operator - > が導入されました。 std::istreambuf_iterator i が与えられた場合、式 ( * i ) . m と i - > m が同じ効果を持つことが期待されます。

しかし、この解決策はその動作の正式な仕様を提供していません。そのため、実装によって異なり、 nullptr を返す、一時オブジェクトのアドレスを返す、あるいはメンバを全く提供しないなどの実装があります。その意図された動作を達成することはほぼ不可能であり、 LWG issue 2790 の解決によって削除されました。

LWG issue 659の解決により、メンバ型 pointer も未規定とされ、 operator-> がプロキシを返すことが可能になりました。これは CharT がクラス型でない場合でも operator-> がコンパイルできるようにするためです。

例

#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
int main()
{
    // 典型的な使用例: イテレータのペアとして表現される入力ストリーム
    std::istringstream in{"Hello, world"};
    std::istreambuf_iterator<char> it{in}, end;
    std::string ss{it, end};
    std::cout << "ss has " << ss.size() << " bytes; "
                 "it holds \"" << ss << "\"\n";
    // シングルパス特性の実証
    std::istringstream s{"abc"};
    std::istreambuf_iterator<char> i1{s}, i2{s};
    std::cout << "i1 returns '" << *i1 << "'\n"
                 "i2 returns '" << *i2 << "'\n";
    ++i1;
    std::cout << "after incrementing i1, but not i2:\n"
                 "i1 returns '" << *i1 << "'\n"
                 "i2 returns '" << *i2 << "'\n";
    ++i2;
    std::cout << "after incrementing i2, but not i1:\n"
                 "i1 returns '" << *i1 << "'\n"
                 "i2 returns '" << *i2 << "'\n";
}

出力:

ss has 12 bytes; it holds "Hello, world"
i1 returns 'a'
i2 returns 'a'
after incrementing i1, but not i2:
i1 returns 'b'
i2 returns 'b'
after incrementing i2, but not i1:
i1 returns 'c'
i2 returns 'c'

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 659 C++98 1. std::istreambuf_iterator には operator - > がなかった
2. メンバ型 pointer は CharT* と規定されていた
1. 追加
2. 未規定に変更
LWG 2790 C++98 LWG issue 659 で追加された operator - > は有用ではなかった 削除

関連項目

std::basic_streambuf に書き込む出力イテレータ
(クラステンプレート)
std::basic_istream から読み取る入力イテレータ
(クラステンプレート)