0

私は 600 個の値の 96 ブロックを含む 2D ベクトルを持っています。これは私が望むものです。

十分なエネルギーが含まれていない (ブロック) を削除する必要があります。私はエネルギーを計算することができましたが、十分なエネルギーを含まない(ブロック)を削除するのにどの方法が良いかわかりません.

あなたの意見では、十分なエネルギーを含むブロックを押し戻し、メモリから元のベクトルを削除する一時的な 2D ベクトルを作成するか、または...

その特定の位置でベクトルからブロックを削除する必要がありますか?

4

3 に答える 3

2

私はあなたがこれを持っていると仮定しています:

typedef std::vector<value> Block;
typedef std::vector< Block > my2dVector;

そして、あなたは次のような関数を持っています:

bool BlockHasInsufficientEnergy( Block const& vec );

十分なエネルギーを持たないブロックを削除したい。

削除するとは、後でブロックを 96 個より少なくしたいということですか? そう仮定します。

次に、これを行う正しい方法は次のとおりです。

void RemoveLowEnergyBlocks( my2dVector& vec )
{
  my2dVector::iterator erase_after = std::remove_if( vec.begin(), vec.end(), BlockHasInsufficientEnergy );
  vec.erase( erase_after, vec.end() );
}

上記は 1 行で実行できますが、2 行で実行すると、何が起こっているのかがより明確になります。

remove_if3 番目の引数の条件を通過するすべてのものを検索し、範囲から除外します。vector人生の最後に「ゴミ」のあった地点を返します。次に、ゴミを消去します。これは remove-erase イディオムと呼ばれます。

于 2012-11-12T19:06:46.757 に答える
0

リンクリストを使用するか、フィルターで除外されたアイテムをNULLとして設定するか、boolメンバーフラグでマークするか、フィルターされたアイテムのインデックスの別のベクトルを保持する必要があります(一度に複数のフィルターがある場合、これによりメモリが節約されます) 。

解決策は、制約が何であるかによって異なります。ランダムアクセスが必要ですか?オブジェクトのコピーにはどのくらいかかりますか?等。

また、STLコード(これはSTLのベクトルですよね?)を見て、要求どおりに動作するかどうかを確認できます。つまり、ベクトルデータをコピーします。

于 2012-11-12T18:01:40.733 に答える
0

これは、この場合、どのように適切に定義するかに一部依存します。どちらの方法にも利点があるかもしれませんが、それらが何であるかを正確に知ることは難しいでしょう。ほとんどの場合、完全に新しい位置を割り当てるのではなく、ベクトルから不要な正確な位置を消去する方が、メモリと処理パフォーマンスの点で多少「優れている」でしょう。その目的のために両端キューまたはリストを使用することを検討する方がよい場合があります。これは、ベクトルがメモリの連続したセグメントを保持しようとするときに、ベクトルが行う可能性のある大きな再割り当てを回避できるためです。

于 2012-11-12T18:02:26.107 に答える