【发布时间】:2012-11-21 06:47:34
【问题描述】:
我正在制作一个关于弹珠的游戏,它使用一个结构来描述弹珠的属性:
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 个等效的 Marble 对象占用了我的向量中的空间。
由于用户可以定义自己的弹珠类型,我不能只硬编码所有可能的弹珠类型,然后让向量存储指向适当弹珠对象的指针。
我正在考虑使用std::set 来存储不同的大理石类型。然后,当用户去创建他的自定义弹珠时,他可以尝试将其插入到集合中。如果同类型的弹珠已经存在,就不会浪费内存了。
我的问题是,如何将引用存储到 std::set 中?例如,假设我的集合由以下大理石类型组成:
{RedMarble, BlueMarble, StrangeMarble, ConfusedMarble}
现在我想将一个红色弹珠分配到游戏板上的 20 位:
m_marbles[20] = ?
我还想检查31位大理石的颜色:
m_marble[31].color;
是否可以以这种方式使用集合? find 和 insert 函数返回迭代器,但如果我在集合中插入更多项,这些迭代器不会失效吗?
【问题讨论】:
-
在我看来你不想要一套。你可能想要一个向量,甚至只是一个数组。
-
您更关心内存占用还是性能?选择其中之一将确定最适合您的解决方案。
-
@Dave - Marble* 的向量?如果没有集合,我如何确定每种不同类型的大理石中只有一种存在(并且正在占用内存)?
-
@Chad - 性能是个问题,因为游戏板是可扩展的。想象一下,当其中 150,000 个包含相同数据时,拥有 300,000 个 Marble 对象。使用 Marble* 的向量的问题是,如果 Marble 的类型已经存在,我需要一种方法来获取指向它的指针。如果它不存在,我可以
new一个新的 Marble 对象并将其添加到唯一 Marble 类型列表中。 -
Quadtrees(和其他空间索引)是相切的,但如果您实际上有 300K 大理石场景并且想要测试碰撞等,您可能会感兴趣......漂亮的网络演示:lab.polygonal.de/?p=202
标签: c++