std::list::iterator
としましょうstd::list::reverse_iterator
。リバースはフォワードから派生したものですか?そうでない場合は、メンバー関数の逆の等価物がないのはなぜlist
ですか?
前もって感謝します。
std::list::iterator と std::list::reverse_iterator とします。リバースはフォワードから派生したものですか?
必ずしもそうではありませんが、それらは異なるタイプである可能性があります (そしておそらくほとんどの実装ではそうです)。イテレータは常にコピーされ、この継承によりスライスが発生します。さらに、すべての操作は非効率的な不整合を回避するiterator
必要があります。virtual
それについて考えてみると、標準が可能な実装として継承を禁止することさえ理にかなっています (間接的に禁止しているかもしれません)。
更新:標準は、std::reverse_iterator
クラス テンプレートの定義std::list::reverse_iterator
と、そのようなテンプレートの特殊化である命令を提供します。継承は可能な実装ではありません。
そうでない場合、リストのメンバー関数に逆の等価物がないのはなぜですか?
base()
aを呼び出してreverse_iterator
、基になる正規の を取得できるためですiterator
。reverse_iterator
aとそれに対応するものとの間の基本的な関係iterator
i
は、&*(reverse_iterator(i)) == &*(i - 1).
C++ 標準ライブラリの GNU の実装では、reverse_iterator と iterator の間に has-a 関係があります。(MSVC++ や llvm の実装を調べたことはありませんが、同じだと思います。)
基本的に、reverse_iterator はイテレーターを受け取り、薄いラッパーを持っているため、++ は -- にエイリアスされ、 -- は ++ にエイリアスされます。基本的にすべての操作は、基礎となる非反転反復子のラッパーです。
そうでない場合、リストのメンバー関数に逆の等価物がないのはなぜですか?
std::list
には逆反復子があります。