ランダムに選択する必要があり、条件を満たすか、すべての要素が選択されるまで効果的に削除する必要がある要素のベクトルを処理しています。しかし、コード実行の後半になるまで実際には削除されないので、有効で有効な要素のリストを維持する必要があります。この2番目のベクトルから要素を消去することができます。または、毎回それを再作成することができます。ベクターは、whileループ内たびに作成された場合の一例を示す下の私のコードの最小限のバージョンを参照してください:C++ベクトル要素の消去と新しいベクトルの作成
Random mRandom; // Pseudo-random number generator
std::vector< Element* > mElements;
for(unsigned index = 0; index < ARBITRARY_VALUE; index++)
mElements.push_back(new Element());
std::vector<bool> removedElements;
bool condition = true;
while(condition == true) {
std::vector<unsigned> availableIndices;
for(unsigned index = 0; index < mElements.size(); index++) {
if(removedElements[ index ] == false)
availableIndices.push_back(index);
}
if(availableIndices.size() > 0) {
unsigned maximum = availableIndices.size() - 1;
unsigned randomIndex = mRandom.GetUniformInt(maximum); // Zero to max
removedElements[ availableIndices[ randomIndex ] ] = true;
Element* element = mElements[ availableIndices[ randomIndex ] ];
condition = element->DoStuff(); // May change condition and exit while
} else
break;
}
それは、ベクターの途中で要素を消去すると、反復するために基本となるシステムが必要であることは明らかです残りの要素を通し、新しい、有効な位置に移動します。明らかに、消去された要素がベクトルの終わり近くにある場合、反復回数が少なくなることを意味します。
私はベクトル要素の消去に関連する費用についていくつかの記事を読んだことがありますが、私の質問に直接対処するものは見ていません。消去後に要素を移動するプロセスは、有効な要素を指す新しいベクトルを作成するたびにすべての要素を反復処理するのが安価になるオーバーヘッドを導入しますか?上のコード例のように。
乾杯、フィル・
'std :: stable_partition'が最終的に削除される要素を分割するように見えます。 – PaulMcKenzie
'mElements'の順序は重要ですか?そうでなければ、 'std :: swap(mElements [randomIndex]、mElements [ - cur_size]);'( 'cur_size'は' mElements.size() 'で初期化され、ループ)。つまり、「削除された」要素を最後まで移動し、それ以降の処理では無視します。必要に応じて、最後に一度にすべて消去することができます。 –