2016-08-27 16 views
1

アルゴリズムを実装しようとしていて、here(スライド19)のようにDICEの「スワップトリック」を見つけました。バトルフィールド3のstd :: vectorスワップを実装して要素を「削除/追加する」

私が理解しているところでは、最初にすべての要素を含むベクトルを作成し、要素を削除する必要があるときは最後の要素と置き換えてベクトルの「サイズ」を小さくします。この「サイズ」は、(ベクトルdoesn't support this internallyのため)「仮想」サイズを追跡するための外部変数です。

注:発注/並べ替えは重要ではありません。また、「削除」と言うと、割り当てられていないものはありません。要素が「使用可能な」範囲外に移動したということだけです。

ここで、削除された要素の要素をベクトルの使用可能な部分に追加する瞬間が来たら、それをどこかに戻す必要があります。そして、これは私が少しブロックしているところです。なぜなら、私たちがそれを交換するとき、私たちはこの繰り返しでそこに存在する必要がある要素と交換することができるからです。同じ要素を入れ替えなければならないからです...

これは、仕事:

繰り返し1:| 1 2 3 4 | (サイズ4)

繰り返し2:| 1 3 | 2 4(要素 '2'と '4'はまだメモリ内にあり、ベクトルの大きさは考慮していないサイズ2)

繰り返し3:| 2 1 3 | 4(大きさ3で要素 '4'が残っています)

私はそれを考えすぎるかもしれませんが、このアルゴリズムを正しく取得する方法があれば役に立ちます。

ありがとうございました。

+0

可能であれば、要素を入れ替える必要はなく、最後の要素を上書きして最後の要素を消去するだけです(したがって、有効な要素について追跡する必要はありません)。 – KIIV

+0

"*私はアルゴリズムを実装しようとしていて、ここで説明したようにDICEの" swap trick "に遭遇しました(スライド19)。*"ここではどのようなアルゴリズムを実装しようとしていますか? DICEの "スワップトリック"はリストから*の要素を消去することではありません。それは単にリストを「可視」と「不可視」に分割するだけです。非可視範囲のデータは、可視データと同様に有効です。それは単に可視ではありません。だから、レンダリングする時間が来たら、連続した表示可能な範囲のレンダリングをレンダリングします。対照的に、あなたは "削除された"要素について話し続けます。これは、データがもはや有効ではないことを示唆しています。 –

+0

だから私は引用符を入れている:) 私は明らかだったと思った。私はそれを修正しようとします – CpCd0y

答えて

5

最初に使用できない要素と交換してから、仮想サイズを増やしてください。したがって、たとえば、のは、これはあなたのベクトルであるとしましょう:

// usable   unusable 
{ 0, 1, 2, 3,  4, 5, 6, 7, 8 } // virtual size = 4 

今度は、あなたが使用可能な部分に使用できない部分から7を移動したいとしましょう。これは最初に使用できない要素なので、4と交換します。

// usable   // unusable 
{ 0, 1, 2, 3, 7, 5, 6, 4, 8 } // virtual size = 5 
+0

それは簡単でした、なぜ私はそれを見ていませんでした。答えをありがとう:) – CpCd0y

+0

"使用できない"値が知られておらず、それらが使用されていても保存されなければならないという要件がない限り、通常の予約済み 'std :: vector '再使用されません。 –

+2

@KerrekSB:これは厳密に要求されているようです(あなたは「知られていません」の代わりに「不明ではない」と仮定します)。 –

関連する問題