名前付き要件:LegacyOutputIterator
LegacyOutputIterator はその指す先の要素に書き込むことができる LegacyIterator です。
LegacyOutputIterator を実装する型の例は std::ostream_iterator です。
LegacyForwardIterator、 LegacyBidirectionalIterator または LegacyRandomAccessIterator がそれ自身の要件に加えて LegacyOutputIterator の要件を満たすとき、それは可変であると言います。
目次 |
[編集]要件
以下の内容を満たす場合、型 X
は LegacyOutputIterator を満たします。
- 型
X
が LegacyIterator を満たす X
がクラス型またはポインタ型である
さらに、
- その出力イテレータに書き込むことができる何らかの型の値
o
(例えばoperator=
がテンプレートの場合など、書き込むことができる型は複数ある可能性があります。 入力イテレータに対するvalue_type
のようなものはありません。) X
型の左辺値r
が与えられたとき、以下の式が有効でなければならず、指定された効果を持たなければなりません。
式 | 戻り値 | 同等な式 | 事前条件 | 事後条件 | 注釈 |
---|---|---|---|---|---|
*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
が暗黙に成り立つとは限りません。
同じ出力イテレータの値を通した代入は一度だけ発生します。 出力イテレータに対するアルゴリズムはシングルパスのアルゴリズムでなければなりません。
出力イテレータを通した代入はインクリメントと交互に行われることが期待されます。 二重インクリメントは未定義動作です (STL のドキュメントに反して現在のところ C++ 標準は二重インクリメントはサポートされると主張しています。 LWG #2035 を参照してください)。
純粋な出力専用のイテレータは iterator_traits<X>::value_type
、 iterator_traits<X>::difference_type
、 iterator_traits<X>::pointer
および iterator_traits<X>::reference
を void であると宣言しても構いません (std::back_insert_iterator などのイテレータはまさにそうしています)。
[編集]標準ライブラリ
以下の標準ライブラリのイテレータは前進イテレータでない出力イテレータです。
- std::ostream_iterator
- std::ostreambuf_iterator
- std::insert_iterator
- std::back_insert_iterator
- std::front_insert_iterator
[編集]関連項目
型が指定された値型のための出力イテレータである、つまり、その型の値を書き込むことができ、前置および後置インクリメントがどちらも可能であることを表します (コンセプト) |