構造体を使用して大理石のプロパティを記述する大理石に関するゲームを作成しています。
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;
このようにセットを操作することは可能ですか?検索および挿入関数はイテレータを返しますが、セットにさらにアイテムを挿入すると、イテレータは無効になりませんか?