ForwardIteratorsはOutputIteratorsである必要がありますか?私の現在のSTL実装(VS2012)はinput_iterator_tag
とoutput_iterator_tag
の両方からforward_iterator_tag
を派生していますが、標準[N3485]ではこの要件が見つかりません。フォワードイテレータ出力イテレータですか?
答えて
C++では、no、forwardイテレータは出力イテレータである必要はありません。出力イテレータの要件は、イテレータが満たすことができるイテレータ要件の残りの部分に関係なく、イテレータが持つことができる追加の一連の要件のようなものです。
場合クラスまたはポインタ型Xが前方反復子の要件を満たす:
- Xは、の要件を満たす前方イテレータのみ入力イテレータ(§24.2.5/ 1)であることが要求されていますそれはsequenに変更可能なイテレータがある場合にのみ、入力イテレータ
- ...実際には
は、前方イテレータは出力イテレータの要件を満たしていますコピーアサイナブルタイプの†。
†または可変メンバーで定義されたoperator=(...) const
の型のシーケンスに対する定数反復子。ポイントに
より、イテレータタグは(§24.4.3/ 2)として標準で具体的に定義されています。
あなたが見ることができるように、forward_iterator_tag
のみinput_iterator_tag
から継承する必要があります。 C++ 03
、前方反復子は、入力と出力イテレータの要件を満たすことが記載されている:
フォワードイテレータは、入力と出力イテレータのすべての要件を満たして使用することができますいずれかの種類が指定されるといつでも
しかし、これは、一定の前進イテレータは出力イテレータの要件を満たしていないだろうと述べ、次の段落で矛盾している:そのカテゴリ、前方、双方向、またはランダムアクセスイテレータのほか
式* iの結果が参照として動作するか、定数への参照として動作するかに応じて、可変または一定にすることもできます。定数イテレータは出力イテレータの要件を満たさず、* i(定数イテレータi)の式の結果は左辺値が必要な式では使用できません。
ただし、イテレータタグの定義はC++ 11と同じです。この矛盾した文言のためにdefect reportがありましたが、最初の引用がセクションの「導入テキスト」にあり、今後これを改訂する可能性が高いため、欠陥ではありません。
SGI definition of a forward iteratorは、入力と出力の両方のイテレータ(コメントで@BenVoigtのおかげで)の改良として与えられます。
でも、implementation of the iterator tagsを見ると、forward_iterator_tag
はまだinput_iterator_tag
から継承されています。
これは、過去の混乱のかなりの領域であったが、VS2012はoutput_
両方から継承するようforward_iterator_tag
を定義している場合のように見える - とinput_iterator_tag
、私はそれがバグであると仮定することができます。
- 1. 入力イテレータ+出力イテレータ+ X =フォワードイテレータ
- 2. 入力イテレータと読み取り専用フォワードイテレータの違いは何ですか?
- 3. タイプ消去C++出力イテレータ
- 4. 出力イテレータにコピーできません
- 5. 入出力イテレータの必要性は何ですか?
- 6. STL出力イテレータに相当するC#はありますか?
- 7. イテレータが異なる出力を出力するのはなぜですか(フェイルセーフに関連します)?
- 8. Gradle出力イテレータでABI名を取得する方法
- 9. STLベクトルのイテレータ値を直接出力できません
- 10. イテレータを使って整数を出力する
- 11. 出力イテレータを渡して関数からstd :: [container]を移入する
- 12. 各イテレータが内容配列の値を出力しない
- 13. イテレータのタイプ:出力vs入力vs.前方アクセスvsランダムアクセス反復子
- 14. イテレータend()を呼び出して実装できますか?
- 15. pythonイテレータの出力をpandasデータフレームに変換する最も速い方法
- 16. イテレータを逆イテレータとして使用できますか?
- 17. 入力イテレータの等価比較
- 18. 入力イテレータでコンテナを2回移動する
- 19. 出力ファイルの出力をカスタムファイルからphpのshell_exec経由で出力する
- 20. mutイテレータから値を抽出する方法は?
- 21. 呼び出し可能イテレータの操作
- 22. Pythonではイテレータ
- 23. GUIインターフェイスで出力を出力する
- 24. Apache 2はデフォルトでjson出力を出力しますか?
- 25. numpy.uniqueは一意でない出力を出力しますか?
- 26. Jenkins:スクリプトからのコンソール出力でハイパーリンク(HyperlinkNote)を出力する
- 27. Razorブロックの出力をビューに出力できますか?
- 28. Angular2出力はES5で出力されますか?
- 29. RNN出力とルールベース出力の違いは何ですか?
- 30. ターミナルで出力されたテラフォームテンプレートを出力しますか?
しかし、これは、ドキュメントがForwardIteratorが「InputIteratorとOutputIteratorの改良」であると述べているSGI定義とは異なるように見えることに注意してください。つまり、ForwardInputIteratorとForwardOutputIteratorが存在しますが、 –
@BenVoigtこれはC++ 03とC++ 11の間で変更されたようです。編集:実際には、それは混乱して待ってください。 –
@sftrabbit:それをクリアしてくれてありがとう。イテレータを前方と出力の両方としてタグ付けする標準的な方法は何ですか? (単に、両方から継承する新しいプライベートタグを導入するか、あるいは別の方法がありますか?) – MFH