C++ 名前付き要件: LegacyOutputIterator
LegacyOutputIterator は、ポインタ先の要素に書き込むことができる LegacyIterator です。
LegacyOutputIterator を実装する型の一例は std::ostream_iterator です。
LegacyForwardIterator、 LegacyBidirectionalIterator、または LegacyRandomAccessIterator が、それ自身の要件に加えて LegacyOutputIterator の要件を満たす場合、それは **mutable** であると説明されます。
目次 |
[編集] 要件
型 X は、以下の場合に LegacyOutputIterator を満たします。
- 型 X は LegacyIterator を満たす
- X はクラス型またはポインタ型である
さらに、以下が与えられたとき
- 出力イテレータに書き込み可能な、ある型の値 o (書き込み可能な型は複数存在する可能性がある。例えば operator= がテンプレートである場合など。入力イテレータのような
value_typeという概念はない) - X 型の左辺値 r
以下の式は有効であり、指定された効果を持たなければなりません。
| Expression | 戻り値 | 等価な式 | 事前条件 | 事後条件 | 注釈 |
|---|---|---|---|---|---|
| *r = o | (使用されない) | r はデリファレンス可能である | r はインクリメント可能である | この操作の後、 r はデリファレンス可能である必要はなく、 r の以前の値のコピーもデリファレンス可能またはインクリメント可能である必要はありません。 | |
| ++r | X& | r はインクリメント可能である | r と ++r は同じイテレータオブジェクトを指し、 r はデリファレンス可能であるか、または終端を過ぎている | この操作の後、 r はインクリメント可能である必要はなく、 r の以前の値のコピーもデリファレンス可能またはインクリメント可能である必要はありません。 | |
| r++ | const X& に変換可能 | X temp = r; ++r; |
|||
| *r++ = o | (使用されない) | *r = o; ++r; |
[編集] 注記
出力イテレータに対する operator* の唯一の有効な使用法は、代入の左辺です。 operator* はプロキシオブジェクトを返す可能性があり、それはメンバ operator= (テンプレートである場合がある)を定義します。
出力イテレータの等価性および不等価性は定義されない場合があります。 operator== が定義されている場合でも、 x == y は ++x == ++y を意味する必要はありません。
同じ値に対する出力イテレータを介した代入は一度だけ発生します。出力イテレータに対するアルゴリズムは、単一パスアルゴリズムでなければなりません。
出力イテレータを介した代入は、インクリメントと交互に行われることが期待されます。二重インクリメントは未定義の動作です(C++標準は現在、STLドキュメントに反して二重インクリメントがサポートされていると主張しています。これは LWG issue 2035 です)。
純粋な出力専用イテレータは、 iterator_traits<X>::value_type 、 iterator_traits<X>::difference_type 、 iterator_traits<X>::pointer 、および iterator_traits<X>::reference を void として宣言することが許可されています(そして std::back_insert_iterator のようなイテレータはまさにそのようにします ただし、difference_type は、std::output_iterator を満たすように定義されている点を除きます。(C++20 以降))。
[編集] 標準ライブラリ
以下の標準ライブラリイテレータは、フォワードイテレータではない出力イテレータです。
| std::basic_ostream に書き込む出力イテレータ (クラステンプレート) | |
| std::basic_streambuf に書き込む出力イテレータ (クラステンプレート) | |
| コンテナへの挿入のためのイテレータアダプタ (クラステンプレート) | |
| コンテナの末尾への挿入のためのイテレータアダプタ (クラステンプレート) | |
| コンテナの先頭への挿入のためのイテレータアダプタ (クラステンプレート) |
[編集] 関連項目
| (C++20) |
型が与えられた値型に対する出力イテレータであること、すなわち、その型の値を書き込むことができ、前置および後置インクリメントの両方が可能であることを規定する (コンセプト) |
| イテレータライブラリ | イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供します。 |