1

std::list::iteratorとしましょうstd::list::reverse_iterator。リバースはフォワードから派生したものですか?そうでない場合は、メンバー関数の逆の等価物がないのはなぜlistですか?

前もって感謝します。

4

2 に答える 2

5

std::list::iterator と std::list::reverse_iterator とします。リバースはフォワードから派生したものですか?

必ずしもそうではありませんが、それらは異なるタイプである可能性があります (そしておそらくほとんどの実装ではそうです)。イテレータは常にコピーされ、この継承によりスライスが発生します。さらに、すべての操作は非効率的な不整合を回避するiterator必要があります。virtualそれについて考えてみると、標準が可能な実装として継承を禁止することさえ理にかなっています (間接的に禁止しているかもしれません)。

更新:標準は、std::reverse_iteratorクラス テンプレートの定義std::list::reverse_iteratorと、そのようなテンプレートの特殊化である命令を提供します。継承は可能な実装ではありません。

そうでない場合、リストのメンバー関数に逆の等価物がないのはなぜですか?

base()aを呼び出してreverse_iterator、基になる正規の を取得できるためですiteratorreverse_iteratoraとそれに対応するものとの間の基本的な関係iterator iは、&*(reverse_iterator(i)) == &*(i - 1).

于 2012-05-27T22:38:43.127 に答える
1

C++ 標準ライブラリの GNU の実装では、reverse_iterator と iterator の間に has-a 関係があります。(MSVC++ や llvm の実装を調べたことはありませんが、同じだと思います。)

基本的に、reverse_iterator はイテレーターを受け取り、薄いラッパーを持っているため、++ は -- にエイリアスされ、 -- は ++ にエイリアスされます。基本的にすべての操作は、基礎となる非反転反復子のラッパーです。

そうでない場合、リストのメンバー関数に逆の等価物がないのはなぜですか?

std::listには逆反復子があります。

于 2012-05-27T22:44:19.603 に答える