1

我正在制作一个关于弹珠的游戏,它使用一个结构来描述弹珠的属性:

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 函数返回迭代器,但如果我在集合中插入更多项目,这些迭代器不会失效吗?

4

4 回答 4

0

构建一个Marble包含指向MarbleType定义每个弹珠的属性的指针的类(对于每种弹珠,您都有一个 实例MarbleType)。该向量可能包含Marbles 或指向 s 的共享指针Marble或唯一指针。如果Marble类很小(轻量级模式),您不会浪费空间,但仍然有一个干净灵活的解决方案。大理石类型可以命名(例如,通过字符串)并存储在std::map.

于 2012-11-20T22:45:00.060 回答
0

是的,你可以做你想做的事。您可以将指针存储在向量中,这些指针指向集合中的弹珠。或者您可以将迭代器存储在您的向量中,这些迭代器再次指向您集合中的 Marbles。

以下是我将如何使用指针:

// 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 回答
0

您应该使向量包含指向Marble 结构的指针:

std::vector<Marble*> m_marbles;

指针不会占用太多空间,您仍然可以Marble用作基类。

于 2012-11-20T22:15:16.033 回答
0

如果游戏板真的只有几千块大,我不会在乎浪费空间。例如

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

按照今天的标准,内存量并不大。

如果它可能变得非常大,那么您确实可以将您独特的 Marbles 存储在一个集合中并使用指针引用它们,正如@BenRuijl 已经展示的那样。

于 2012-11-20T22:20:07.897 回答