用唯一的成员id标识对象是个好主意吗?

Is it a good idea to identify objects by an unique member id?

本文关键字:好主意 对象 标识 唯一 成员 id      更新时间:2023-10-16

我的问题是,我应该如何将对象相互关联。

有两个向量,vector<Baby> babiesvector<Toy> toys。每个婴儿和每个玩具都有一个独特的成员int id。因此,所有的婴儿和玩具都从0到n编号。

现在,每个婴儿有一个首选的玩具,每个玩具有一个首选的婴儿。到目前为止,我使用的是指针:婴儿有一个指向他喜欢的玩具的指针,而这个玩具有一个指向婴儿的指针。(没关系,因为我永远不会改变向量)然而,区分婴儿和玩具的是它们的ID,而不是它们在向量中的位置。

随着时间的推移,我开始质疑我的设计,并发现指针可以工作,但它们将来可能会导致问题。相反,如果我使用ID,我将会很好,但我需要访问整个婴儿或玩具向量。

在这种情况下是否有常见的做法?使用指针是好主意吗?我应该编写自己的容器,以一种智能的方式使用ID吗?

编辑:

我想补充一点,我考虑过用一张地图把婴儿和玩具联系起来。然而,我在运行期间确定婴儿与玩具的关系(以及其他方式)。寻找这种关系是这个项目的主要部分。因此,我不确定是否可以使用地图。不过,我会看看它(直到现在还没有使用它)。更重要的是,关于首选玩具和婴儿的信息必须是对象的一部分,而不是(仅仅)一个高级数据结构。

为关系使用唯一id有一些优点。这些id不能像指针那样摇摆不定,也不能像向量索引那样越界。它们可以很容易地连载。当向量被重新分配或重新排序时,它们不会失效。

但是它们也有一些缺点。确保它们保持唯一取决于您(使用guid可以帮助实现这一点)。它们的工作效率也很低。要通过ID查找对象,必须搜索整个向量。您可以通过vector进行一次传递以创建查找map/unordered_map/vector,其中键是ID,值是指向vector中的对象或索引的指针。

另一种选择是使用std::map<Baby, Toy>/std::map<Toy, Baby>甚至std::unordered_map<Baby, Toy>/std::unordered_map<Toy, Baby>

#include <map>
std::map<Baby, Toy> babyMap;
std::map<Toy, Baby> toyMap;
// ...
babyMap[theBaby] = theToy;
toyMap[theToy] = theBaby;

如果Baby"碰巧"喜欢多个玩具,反之亦然,您可以使用std::map<Baby, std::set<Toy>> s/std::map<Toy, std::set<Baby>>

p。D:通常,int样式的id是一种不好的代码气味,并且可能导致以后的严重问题。

这个结构之一的向量呢?

struct BabyToy { Baby B;  Toy T;};

class BabyToy
{
  public:
  Baby B;
  Toy T;
  BabyToy(Baby b, Toy t)
  {
     B=b;
     T=t;
  }
};

对不起,在你的问题中,我读到:

现在,每个婴儿有一个首选的玩具,每个玩具有一个首选的宝贝。