アルゴリズムを実装しようとしていて、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'が残っています)
私はそれを考えすぎるかもしれませんが、このアルゴリズムを正しく取得する方法があれば役に立ちます。
ありがとうございました。
可能であれば、要素を入れ替える必要はなく、最後の要素を上書きして最後の要素を消去するだけです(したがって、有効な要素について追跡する必要はありません)。 – KIIV
"*私はアルゴリズムを実装しようとしていて、ここで説明したようにDICEの" swap trick "に遭遇しました(スライド19)。*"ここではどのようなアルゴリズムを実装しようとしていますか? DICEの "スワップトリック"はリストから*の要素を消去することではありません。それは単にリストを「可視」と「不可視」に分割するだけです。非可視範囲のデータは、可視データと同様に有効です。それは単に可視ではありません。だから、レンダリングする時間が来たら、連続した表示可能な範囲のレンダリングをレンダリングします。対照的に、あなたは "削除された"要素について話し続けます。これは、データがもはや有効ではないことを示唆しています。 –
だから私は引用符を入れている:) 私は明らかだったと思った。私はそれを修正しようとします – CpCd0y