5

私は書いていますiterator(実際にはconst_iterator現在のオブジェクト用であり、また作成したいと思いますreverse_const_iterator

私はこれを行う方法を確認するために周りを見回しました、そして私はこれに遭遇しました

ただし、イテレータが逆になっている場合、逆にされたバージョンは範囲内の同じ要素を指しているのではなく、その前の要素を指していることに注意してください。これは、範囲の最後の要素を配置するためです。範囲内の最後の要素を指すイテレータは、逆にすると、最後の要素を指すように変更されます(それを超えない)。 )範囲の(逆にすると、これが範囲の最初の要素になります)。また、範囲内の最初の要素へのイテレーターが逆になっている場合、逆にされたイテレーターは最初の要素の前の要素を指します(逆にすると、これは範囲の最後の要素になります)。

これはユーザーの観点から何が起こるのでしょうか、それとも間接参照するときに、それが指していると思うreverse_iteratorオブジェクトの値/参照を与えることによってこれを抽象化しないのでしょうか?これは単なる実装の詳細ですか?

私の理解は:

for(i = obj.rbegin(); i != obj.rend(); i++)

と同等でした

for(i = obj.begin(); i != obj.end(); i++)

逆を除いて。したがって*i、最初のケースではコンテナを逆方向に進み、2番目のケースではコンテナを順方向に進みます。私の本能は正しいですか?

4

1 に答える 1

5

あなたはそれが抽象化であることは正しいです。逆反復子には、逆参照した場合に取得するオブジェクトの後の要素を指す通常の反復子が含まれます。ただし、これは単なる実装の詳細ではありません。アダプターは、基になる反復子を返すstd::reverse_iteratorメンバー関数呼び出しを提供します。base

標準ではstd::reverse_iterator、適応するイテレータとの関係が次のイテレータ アダプタとして定義されています。

逆方向反復子とそれに対応する反復子 i の間の基本的な関係は、次の恒等式によって確立されます。&*(reverse_iterator(i)) == &*(i - 1)

の一般的な用途baseは、コンテナから要素を消去することです。これは次のように行われます。

it++;
lst.erase(it.base());

コンテナーを逆方向に反復しながらこれを実行したい場合は、次のようにします。

it++;
std::list<int>::reverse_iterator(lst.erase(it.base()));
于 2013-02-27T10:07:11.667 に答える