2013-04-25 9 views
7

私はC++でゲームアプリケーションを作成しています。私は2次元のstd::vectorTileのオブジェクトとして表現したマップを持っています。2D std :: vectorで行/列を移動する最も効率的な方法

プレーヤーの移動に合わせて地図を更新する必要があります。私は、例えば、ローカルクライアントのマップに配置する必要が世界地図の新しい部分で行または列を取得するサーバアプリケーションから:

enter image description here

図1ではプレイヤーが移動する前に、ローカルマップがあります。一番上の行は、オブジェクト1、2の中心と0の下に塗りつぶされます。プレイヤーが上に移動すると、オブジェクト3でいっぱいになった新しい上の行が表示され、他のすべてが下に移動し、前の一番下の行が消えます。

ループはforというループで必要なオブジェクトを移動するだけでできますが、標準ライブラリにはすでにアルゴリズムがあるか、この種の変更を達成するために多くの効率的な方法があると思いました。

EDIT:

申し訳ありませんが、私は、行のために、列のため、この操作を行うとの違いが、実際にはそこにあるだろうと認識していませんでした。だから私は時にはコラムのためにそれをする必要があるので、私もタイトルを編集しました。

+1

'std :: vector >'はありますか?どのディメンションが列を表しますか?どちらの行は行ですか?これは重要です。なぜなら、2番目の次元が行を表す場合、この「上」コマンドを実現するのは簡単だからです。行1と2を入れ替えることができます。次に、行1と3を入れ替えて、行1を置き換えます。スワップは、ベクトルのポインタを排他的論理和(XOR)して効率的に実装することができます。 – Carsten

答えて

6

イテレータを実装し、ベクトルの要素をまったく移動したくない場合があります。上の行のインデックス(画面上)の変数を定義してから、モジュロ演算子を使用してすべての行を繰り返し処理します(したがって、000行のみが333で上書きされます)。 0)。

  • が上向きに移動:このアルゴリズムから、効果的(のみなど、多くのメモリが必要に応じて書き込み)、および任意の方向にスクロールするために使用することができている、最後の行を変更する一番上の行のインデックス(MOD行番号)をデクリメント
  • 下方に移動:一番上の行インデックス(MOD行番号)をインクリメント、最初の行を変更
  • 左移動:最後COL
  • 右移動変更、左COLインデックス(MOD COL番号)をデクリメント左COLをインクリメントindex(mod col番号)、最初のcolを変更します。
+0

これは本当に良い解決策ですが、私はイライラを実装すべきだと書いていますが、どこに実装すればよいのでしょうか? – dziwna

+1

@dziwna:行/列のインデックスを保持するクラスに行列をラップするだけでなく、それらのインデックスを使用するアクセサを提供します(スクロールの方法は、その間にあります)。 – syam

+0

@syamありがとう、ありがとう! :) – dziwna

2

ベクトルに特化したstd :: swapを使うことができます。これは、2つのベクトルに対して複数のポインタスワップが必要なため効率的です。また、std :: rotateを使用することもできますが、スワッピング手法を使用するかどうかはわかりません。

残念ながら、これは行のベクトルがあり、行を移動する必要がある場合、または列のベクトルを持ち、列を移動する必要がある場合にのみ機能します。 両方の操作を効率的に行うには、より複雑なデータ構造を使用する必要があります。 std::dequestd::list

3

はあなたが速い挿入を必要なときにすぐに両方四肢に消去/頭に浮かぶ2個の標準コンテナがあります。しかし、彼らは彼らの特定の要件と制限があります。

ベクトルにぶら下がっている場合は、コピーする代わりにオブジェクトを効率的に移動できるC++ 11の移動セマンティクスを利用するか、@WebMonsterが何らかの循環インデックスを使用できるあなたのバッファは、移動/コピーの必要性を完全に排除します。

あなたの要件を前提として、それらが完全であると仮定すると、私はおそらく最も効率的な@ WebMonsterのソリューションに行きます。 編集:あなたの要件が変更され、列をスクロールする必要があるようになったので、彼のソリューション「循環索引」は間違いなく道のりです。

2

私はboost matrixを試してみます。

std::std::swap_ranges()を新しい値で交換する必要がある行を修正するためにあなたの2D std::vector

std::transform()で、すでに既存の行を移動する:

0

可能な方法は使用することです。

関連する問題