2015-11-12 15 views
7

のベクトルを維持する:は、私が機能を持っているデータのイテレータ

void get_good_items(const std::vector<T>& data,std::vector<XXX>& good_items); 

この機能は、すべてのデータをチェックし、条件を満たし、彼らがgood_itemsでどこを返すのアイテムを見つける必要があります。

std::vector<XXX>の代わりに何が最適でしょうか?すべての良いインデックスを含む

  1. std::vector<size_t>
  2. std::vector<T*>これらのアイテムには、アイテムへのポインタが含まれています。
  3. std::vector<std::vector<T>::iterator>このアイテムにはイテレータが含まれています。
  4. 他??

EDIT:

私はgood_itemsで何をしますか? 多くのもの...その1つはベクトルから削除して別の場所に保存することです。多分後で

EDIT 2何か他:私にとって最も重要なの

一つはdataでアイテムにアクセスする方法では、good_itemsの構造体に応じて、速いのでしょうか?

EDIT 3:

私はちょうど私の考えは間違っていたことをrelizedています。生ポインタ(またはスマート)をベクトルの項目として保持する方が良いわけではないので、ポインタ(ベクトル)の実際の値を保持することができます。ポインタだけなので重いコピーを恐れません。

+0

はあなたが唯一の呼び出し元の関数で結果を使用するか、またはあなたを行いますベクタが既に変更されている可能性があるため、再度使用できるようにストアしようとしていますか? 'get_good_items'とあなたが結果を使用している間のベクトルを変更している(他のスレッドの可能性もある)他のコードはありますか? – CompuChip

+0

今のところスレッドセーフであることを心配しないでください –

+0

データベクトルが変更された場合(要素の消去、あるメモリ範囲から別のメモリ範囲への移動など)、参照が破損します。この場合、良い項目をデータからgood_itemにコピーすることができます。データベクタに問題がなければ、ポインタに簡単にポインタを格納することができます(したがって、2つは対処が簡単で、読みやすくなります)。 – rbaleksandar

答えて

4

元のベクトルからアイテムを削除すると、リストにあるすべての方法が問題になります。

元のベクトルに項目を追加すると、2番目と3番目の項目に問題が発生します。 push_backを使用してアイテムを追加すると、最初の問題は発生しません。

元のベクトルを変更しないと、これらのすべてが問題なくなります。

それで、std::vector<size_t>を使用することをお勧めします。

2

述語を構成する要素を削除する場合は、erase-removeイディオムが最も簡単な解決策です。

このような要素をコピーする場合は、std::copy_ifが最も簡単な解決策です。

コンテナの2つのパーティション、つまり1つのコンテナが良いコンテナともう1つのコンテナを持っている場合は、std::partition_copyが良い選択です。

一般的に、このような要素の反復を可能にするために、効率的なソリューションは反復中に述語をチェックする一連の反復子を返します。そのようなイテレータは標準ライブラリにはないと思うので、あなたはそれらを自分で実装する必要があります。幸いなことに、すでにあなたのためにブーストされています:http://www.boost.org/doc/libs/release/libs/iterator/doc/filter_iterator.html

2

入力が容易なので、std::vector<size_t>またはstd::vector<T*>とします。さもなければ、これらの3つのベクトルはかなり同等であり、それらはすべて要素の位置を特定します。

std::vector<size_t>制限を知っていれば、インデックス用のより小さいタイプを使用することができます。

このベクターには多くの要素が存在することが予想される場合は、代わりにboost::dynamic_bitsetを使用してメモリを節約し、CPUキャッシュの使用率を高めることを検討してください。要素ごとのビット。ビット位置は元のベクトルへのインデックスです。

+0

どのようにstd :: vector は位置を特定できますか?例えば、生のポインタからベクトル内のアイテムのインデックスを知ることはできますか? –

+0

はい、ベクトルの連続性のために可能です。範囲外です。他のコンテナでも使えますか? –

+0

@HumamHelfawi何かはあなた自身の質問に対する答えを知っていると私に伝えます。これは偶発的なデータ構造によく似ています。詳しくはhttps://youtu.be/sWgDk-o-6ZEを参照してください。 –

0

あなたは私の理解から、解決されている問題は、二組の交点である、と私は標準ライブラリから解決のために行くだろう:std::set_intersection

関連する問題