2013-02-27 21 views
5

を逆転。C++イテレータと私は(実際に、それは私の現在のオブジェクトの<code>const_iterator</code>であり、私もまた<code>reverse_const_iterator</code>を作成したい<code>iterator</code>を書いてイテレータ

私はこれを行う方法を確認するために、周りを見回したと私thisに出くわし:

注意が反復子が反転するときに、反転バージョン を配置するために、これはそうである、範囲内の同じ要素に、それに先行する1 を指していないこと。過去の終わりのために 範囲の要素:それは の範囲の最後の要素を指し示すエリータは、その範囲の最後の要素( ではない)を指すように変更されます( が反転した場合、範囲の最初の要素になります)。また、範囲内の最初の要素の反復子が である場合、逆イテレータは最初の 要素の前の要素を指します(これは、 が逆転した場合、範囲の最後の要素になります)。

は、ユーザーの視点から何が起こるかこのとき、またはあなたreverse_iteratorデリファレンスそれはあなたがそれを指している思いオブジェクトの値/参照を与えることではない、この抽象化しますか?これは単なる実装の詳細ですか?

私の理解がされた:

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

は逆の場合を除き

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

と同等でした。そして、*iは、最初のケースではコンテナを逆戻りし、2番目のケースではコンテナを前に進めます。私の本能は正しいのですか?

+2

それはちょうど働きます。 –

+0

補足:イテレータを使うときは、ポストインクリメントの代わりにプリインクリメント( '++ i')を使うべきです。 –

答えて

5

これは抽象です。逆方向反復子には、逆参照した場合に取得するオブジェクトの後の要素を指す通常の反復子が含まれています。ただし、実装の詳細だけではありません。 std::reverse_iteratorアダプタには、基本的なイテレータを返すメンバ関数呼び出しbaseが用意されています。

標準イテレータに次の関係を有するイテレータアダプタとしての適合をstd::reverse_iteratorを定義:

iを識別することによって確立される逆方向反復子とそれに対応するイテレータの間の基本的関係:&*(reverse_iterator(i)) == &*(i - 1)

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

baseための一般的な使用は、そうのように行われるであろう容器から要素を消去され

あなたは逆にコンテナを反復しながら、これを実行したい場合は、あなたがどうなる:

it++; 
std::list<int>::reverse_iterator(lst.erase(it.base())); 
+0

副次的な疑問として、根底にある「イテレータ」をベースにすることはなぜ有用なのでしょうか? – Bingo

+0

@Bingo:コンテナはそれを期待するかもしれないので、例えば、 'erase'は' iterator'と 'reverse_iterator'ではない*として指定されます。 –

+0

@Matthieuああ、そうです。それは理にかなっている。 – Bingo

関連する問題

 関連する問題