通过唯一的成员ID识别对象是一个好主意吗?

时间:2015-09-11 18:36:03

标签: c++ pointers vector containers

我的问题是,我应该如何将对象彼此联系起来。

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

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

当我相处时,我质疑我的设计并发现指针有效,但它们可能会导致将来出现问题。相反,如果我使用身份证,我会没事,但我需要能够访问整个婴儿或玩具载体。

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

修改 我想补充一点,我已经考虑过将婴儿与玩具联系起来的地图。但是我在运行时确定了婴儿与玩具的关系(以及相反的方式)。找到这种关系是该计划的主要部分。因此,我不确定我是否可以使用地图。但是,我会看一下(直到现在还没用过)。更重要的是,有关首选玩具和婴儿的信息必须是对象的一部分,而不是(仅)上级数据结构。

4 个答案:

答案 0 :(得分:2)

为关系使用唯一ID具有一些优势。 ID不能像指针那样悬挂,也不能像向量索引一样超出范围。它们可以很容易地序列化。重新分配或重新排序向量时,它们不会失效。

但他们也有一些缺点。您可以确保它们保持唯一(使用GUID可以帮助解决此问题)。它们的使用效率也非常低。要按ID查找对象,您必须搜索整个向量。您可以通过向量执行一次传递来创建查找map / unordered_map / vector,其中键是ID,值是指向向量中对象或索引的指针。

答案 1 :(得分:0)

另一种方法是使用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是一种不良代码气味,可能会导致严重问题。

答案 2 :(得分:-1)

  

这个结构之一的矢量怎么样?

struct BabyToy { Baby B;  Toy T;};
  

class BabyToy
{
  public:
  Baby B;
  Toy T;

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

答案 3 :(得分:-1)

抱歉,但在你的问题J中读到:

  

现在,每个宝宝都有一个首选玩具,每个玩具都有首选   婴儿