我正在制作一个关于弹珠的游戏,它使用一个结构来描述弹珠的属性:
struct Marble
{
Color color;
int weight;
//Other customizable marble properties
};
我目前正在使用 astd::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 个等效的 Marble 对象占用了我的向量中的空间。
因为用户可以定义他自己的弹珠类型,所以我不能硬编码所有可能的弹珠类型,然后让向量存储一个指向适当弹珠对象的指针。
我正在考虑使用 astd::set
来存储不同的大理石类型。然后,当用户去创建他的自定义弹珠时,他可以尝试将其插入到集合中。如果已经存在相同类型的大理石,则不会浪费内存。
我的问题是,如何将引用存储到std::set
? 例如,假设我的集合由以下大理石类型组成:
{RedMarble, BlueMarble, StrangeMarble, ConfusedMarble}
现在我想在游戏板上的位置 20 上分配一个红色弹珠:
m_marbles[20] = ?
我还想检查 31 位大理石的颜色:
m_marble[31].color;
是否可以以这种方式使用集合?find 和 insert 函数返回迭代器,但如果我在集合中插入更多项目,这些迭代器不会失效吗?