1

構造体を使用して大理石のプロパティを記述する大理石に関するゲームを作成しています。

struct Marble
{
Color color;
int weight;
//Other customizable marble properties
};

私は現在std::vector、ゲームボードのどのビー玉がどの位置にあるかを追跡するためにを使用しています。

std::vector<Marble> m_marbles;

いつでも、ベクトルにインデックスを付けることで、大理石の位置を指定して、大理石のプロパティを確認できます。位置20の大理石の色を確認するには:

m_marbles[20].color;

ユーザーはカスタムビー玉を作成してゲームボードに追加できます。ゲームボードに新しい大理石を追加したい場合は、新しい構造体オブジェクトを作成し、それをベクトルにプッシュします。

Marble m;

//Fill struct with marble information

m_marbles.push_back(m)

問題は、ゲームボードが非常に大きく(何千ものビー玉)、ビー玉の多くがまったく同じであるということです。

ゲームボードに4000のポジションがあるとしましょう。たぶん3000個は重さ1.0の赤い大理石です。現在のソリューションでは、3000個の同等の大理石オブジェクトが私のベクトルのスペースを占めています。

ユーザーは自分のマーブルタイプを定義できるので、可能なすべてのマーブルタイプをハードコーディングしてから、適切なマーブルオブジェクトへのポインターをベクターに格納させることはできません。

std::setさまざまな種類の大理石を保管するためにを使用することを考えていました。次に、ユーザーがカスタムマーブルを作成するときに、セットに挿入してみることができます。同じ種類の大理石がすでに存在する場合、それはメモリを浪費しません。

私の質問は、参照をに保存するにはどうすればよいstd::setですか?たとえば、私のセットがこれらの大理石のタイプで構成されているとしましょう。

{RedMarble, BlueMarble, StrangeMarble, ConfusedMarble}

次に、ゲームボードの位置20に赤い大理石を割り当てます。

m_marbles[20] = ?

31の位置にある大理石の色も確認したいと思います。

m_marble[31].color;

このようにセットを操作することは可能ですか?検索および挿入関数はイテレータを返しますが、セットにさらにアイテムを挿入すると、イテレータは無効になりませんか?

4

4 に答える 4

0

ベクトルに大理石構造へのポインタを含める必要があります。

std::vector<Marble*> m_marbles;

ポインタは多くのスペースを占有せずMarble、基本クラスとして引き続き使用できます。

于 2012-11-20T22:15:16.033 に答える
0

ゲームボードが本当に数千の場所の大きさであれば、スペースを無駄にすることは気になりません。例えば

10000 places * sizeof(Marble) = 10000 * 100 bytes ~ 1 MB

今日の基準では、大量のメモリではありません。

それが非常に大きくなる可能性がある場合は、@ BenRuijlがすでに示しているように、実際に独自のビー玉をセットに格納し、ポインターでそれらを参照することができます。

于 2012-11-20T22:20:07.897 に答える
0

Marble各大理石のプロパティを定義するためのポインタを含むクラスを作成しますMarbleType(大理石の種類ごとに、のインスタンスが1つありますMarbleType)。ベクトルには、Marblesまたはsへの共有ポインタMarbleまたは一意のポインタを含めることができます。クラスが小さい場合Marble(フライウェイトパターン)、スペースを無駄にすることはありませんが、それでもクリーンで柔軟なソリューションがあります。大理石のタイプには(文字列などで)名前を付けて、に格納できますstd::map

于 2012-11-20T22:45:00.060 に答える
0

はい、あなたはあなたがやろうとしていることをすることができます。ベクトルにポインタを格納できます。ポインタは、セット内のビー玉を指します。または、イテレータをベクトルに格納することもできます。このイテレータは、セット内のビー玉を指します。

これが私がポインターでそれをする方法です:

// A useful helper funtction -- not required, but useful.
const Marble* Helper(const Marble& m) {
  static std::set<Marble> uniqueMarbles;
  return &*(uniqueMarbles.insert(m).first);
}

// A vector of pointers to marbles
std::vector<const Marble*> m_marbles;

// You can pass temporaries to the helper function, and it returns a permanent pointer
m_marbles.push_back(Helper(Marble(RED, 1.0));

Marble m;
m.setColor(BLUE);
m_marbles.push_back(Helper(m));


// You can reference your marbles
Color c = m_marbles[i]->getColor();

// Hopefully the following will produce a compiler error message
m_marbles[i]->setColor(GREEN); // Oops, m_marbles holds const pointers
于 2012-11-20T22:47:34.023 に答える