Namespaces
Variants

std:: istreambuf_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(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 ,

/* 未指定 */ , 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以降)

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Member types、Member functions、Non-member functions、Notes、Example、Defect reports、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどはすべて変更せず保持しました - 数字の番号付けもそのまま保持しました

メンバー型

メンバー型 定義
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 から読み取る入力イテレータ
(クラステンプレート)