7

C++ 11で順方向出力反復子を標準的な方法で定義するにはどうすればよいですか?

標準によれば、forward_iterator は input_iterator のみです。したがって、対応するのforward_iterator_tagは extends のみinput_iterator_tagです。イテレータを定義するために使用std::iteratorしている場合、forward-output-iterator にはどのタグを使用しますか?

forward_iterator_tag両方を拡張するプライベートタグを定義することは標準的output_iterator_tagですか、またはより良い解決策がありますか?

4

1 に答える 1

6

行うべき標準的なことは、からstd::iterator<std::forward_iterator_tag, T>のみ継承することです。イテレータには1つのカテゴリしかありません。

この標準には、順方向イテレーターでもある出力イテレーターのアルゴリズム(または他の用途)がありません。標準での出力イテレータのすべての使用には、シングルパスのみが必要です。

代わりに、この標準には、フォワード/ビディ/ランダムアクセスのカテゴリの可変イテレータと不変イテレータの概念があります。イテレータを介して書き込む必要があり、シングルパスよりも優れている必要があるすべてのアルゴリズムも、それらが書き込むのと同じイテレータを介して読み取ります。これはstd::removestd::sortおよびその他の変更アルゴリズムです。

可変イテレータと不変イテレータの違いは、イテレータタグでは検出されません。これは、代入式が整形式であるかどうかによって決まります。したがって、たとえば、イテレータをstd::sort不変に渡す場合、アルゴリズムはとにかくコンパイルされないため、通常、入力イテレータにも。のタグを付ける必要はありませんoutput_iterator_tagOutputIterator意志を必要とするすべてのアルゴリズムは、可変ForwardIteratorで動作します。ここでも、でタグ付けする必要はありませんoutput_iterator_tag

標準アルゴリズムとは異なるニーズがある場合、あなたの提案がイテレータで機能しない理由をすぐに考えることはできません。ただし、可変の標準イテレータは検出されません。たとえばstd::deque<int>::iteratorint*イテレータカテゴリrandom_access_iterator_tagがあり、プライベートタグではなく、とは関係ありませんoutput_iterator_tagiterator_traits::iterator_categoryしたがって、必要な情報を提供するために既存のものを適応させることを期待するよりも、独自の特性クラスを定義する方がおそらく良いでしょう。

于 2012-12-27T23:38:15.023 に答える