2016-08-09 3 views
5

私のカスタムランダムアクセスコレクションクラスのイテレータが必要です。私はstd::sortとイテレータを使いたいです。制限された時間予算を持つC++の新人だから、私は自分自身ですべてのことを書いてはいけません。なぜboostのcounting_iteratorはconstですか?

私のイテレータは基本的に単なる単純なものですsize_t。したがって、私はboost::counting_iteratorが良いマッチであると思った。私がIncrementableを完成させたら、counting_iteratorは参照タイプをconst Incrementable&と定義しなければならないことに気がつきました。

私はまだ多くのC++で混乱していますが、のイテレータを使用できないと考えています。なぜなら、constイテレータはコレクション要素を入れ替えることができないからです。

boost::counting_iteratorは参照タイプをconstと定義していますが、もっと重要なのは、代わりに使用する必要があるのはなぜですか。

+1

'boost :: counting_iterator'はコンテナにアクセスできません。これは、自然数のシーケンス「0,1,2、...」に「アクセスする」ために作成されます。そのため、その参照型は 'const'です:' 2'をハックして '3'にすることはできません。 –

+0

"カスタムランダムアクセスコレクションクラスのイテレータが必要です。" 「私は初心者です」と互換性がない可能性があります。なぜカスタムコレクションクラスが必要なのか尋ねてもいいですか? –

+0

"私のイテレータは基本的に単純な' size_t'です "と私は理解していません。'size_t'はイテレータのコンセプトの要件を満たしていません。 – KABoissonneault

答えて

1

なぜboost :: counting_iteratorは参照型をconstとして定義していますか?

as described hereの目的は、イテレータがインクリメントされるときにインクリメントされるオブジェクトで配列を塗りつぶすことです。私はブーストの専門家btw)を持っているので、それはあなたが手渡すインクリメンタルオブジェクトのコピーを保持しているようだ、ドキュメントを介して簡単な外観を持っていた。その後、内部コピーへのconst参照を返して、誰かが内部コピーを変更するのを止めます。

私はIncrementableを完了したら、私はcounting_iteratorがconstのIncrementable &としてその参照型を定義することを実現しなければなりませんでした。

はい、逆参照するときには、それ自体が一定でない(したがって、それがインクリメントとデクリメントすることができる)であり、それが保持しているIncrementableオブジェクトに一定の基準を返します。

const iteratorをコレクション要素のスワップに使用できないため、これによってstd :: sortでイテレータを使用できなくなると思います。

正しい:)アンダーフードスワップは、私が代わりに何を使うべき

​​

のように見えますか?

コンテナによって異なります。コンテナのイテレータには、コンテナ内の要素へのポインタが含まれている必要があります。たぶん、標準のイテレータを使用するだけです。

+0

あなたは正しいです、 'counting_iterator'ははっきりと異なる目的を持っています。残念ながら、私のコレクションはコレクション要素への単純なポインタを許可しません。私のコレクションはSQLのリレーションに似ており、その要素を列で格納します。一方、イテレータは、行単位でモデル化するため、イテレータの読み書きは、何らかの翻訳プロセスを経なければなりません。したがって、単純なポインタはオプションではありません。 –

+0

あなたはどのような標準イテレータを考えていますか?特定のコレクション型にバインドされているイテレータのみが見つかります。 –

+0

私はSQLの専門家ではありませんが、 'std :: vector'の' std :: tuple'を使用している場合は、イテレータを使ってタプル全体を反復することはできませんどのようにそれを再帰的に行うかもしれないかについて](http://stackoverflow.com/a/6894436/6367128))。すべてのベクトルに同じ基本型が含まれていますか?もしそうなら、あなたはタプルを避けてベクトルのベクトルを使うことができます。 – Judge

関連する問題