2010-11-20 11 views
3

いくつかのレガシーコードを組み込んだ2パスアルゴリズムを作成しようとしています。私は特定のコンテナを2回、順番に1回、逆の順に1回移動したい。明らかに、私の最初の考えはiteratorreverse_iteratorを使用することでしたが、私が使用しているコンテナクラスのデザイナーは、コンテナのためにreverse_iteratorを定義するのには合っていませんでした(reverse_iteratorsここではiteratorsのように参照解除できません)。私はすでにreverse_iteratorが必要なアルゴリズムを持っています。C++ reverse_iterator代替方法

アルゴリズムの最初の部分で最初のパスのイテレーターを使用し、アルゴリズムpush_frontを新しいコンテナーに入れ、新しいコンテナーを反復処理することを考えました。これは私のアプリケーションでは重要ではないメモリを占有しますが、C++でreverse_iteratorsのクリーンな代替手段があるのでしょうか?あるいは、転送をiteratorsだけ使ってアルゴリズムを修正する必要がありますか?

答えて

4

逆の順序でコンテナの要素を反復処理する必要がある場合は、必ずしも逆イテレータを使用する必要はありません。コンテナは、双方向イテレータを持っている場合

、その後は通常のイテレータを使用して、代わりにbegin()からend()に反復する++itを使用してのend()からbegin()に反復する--itを使用することができます。

これは少しトリッキーですので、あなたは逆のイテレータ(これは基本的に++--を交換し、仕事にこれを取得するために必要な策略をカプセル化)に普通のイテレータを変換するために、std::reverse_iteratorラッパーを使用することができます。

コンテナに双方向イテレータがない場合は、コンテナの要素を逆順に反復することができないことを意味します。その場合は、アルゴリズムを書き直すか、別のコンテナを使用する必要があります。

双方向イテレータを持つコンテナであれば、になります。これは逆イテレータ機能を提供します。これは、STLおよびC++標準ライブラリの「コンテナ」コンセプトの一部です。

+0

ありがとう、iteratorが双方向であるように見えます。クラスは実際に 'std :: reverse_iterator'を使って' reverse_iterator'を実装していますが、それを使用しようとすると逆参照するとコンパイラエラーが発生します。 – Zeke

+1

@ Zeke:使用しているコードと正確なコンパイラエラーを投稿する必要があります。さもなければ、それは一種の助けが難しいです。 :( –

+0

@James:十分な公正私は '--it'のアイデアが働いていると思いますが、' for'ループ条件の提案はありますか? 'for(--it; it != end; --it) '最後の項目を見逃してしまいます。ループ本体の終了後に条件を変更するか、ループコードをインクルードする必要がありますか? – Zeke

関連する問題