c++ - 通过唯一的成员 ID 来标识对象是个好主意吗?

标签 c++ pointers vector containers

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

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

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

随着时间的推移,我质疑我的设计并发现指针是有效的,但它们可能会在未来导致问题。相反,如果我使用 ID 就没问题,但我需要访问整个婴儿或玩具载体。

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

编辑: 我想补充一点,我考虑过一张将婴儿和玩具联系起来的 map 。但是,我在运行时确定婴儿与玩具的关系(反之亦然)。找到这种关系是该程序的主要部分。因此我不确定我是否可以使用 map 。不过,我会看看它(到现在还没用过)。更重要的是,有关首选玩具和婴儿的信息必须是对象的一部分,而不仅仅是高级数据结构的一部分。

最佳答案

为关系使用唯一 ID 有一些优势。 ID 不能像指针那样悬空,也不能像 vector 索引那样越界。它们可以很容易地序列化。当 vector 被重新分配或重新排序时,它们不会失效。

但是它们也有一些缺点。由您来确保它们保持唯一性(使用 GUID 可以帮助做到这一点)。他们的工作效率也可能非常低。要按 ID 查找对象,您必须搜索整个 vector 。您可以通过 vector 创建一个查找 map/unordered_map/vector,其中键是 ID,值是指针 vector 中的对象或索引。

关于c++ - 通过唯一的成员 ID 来标识对象是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32530067/

相关文章:

c++ - 使用 QScrollArea 使 QVBoxLayout 可滚动

c++ - 圆括号内的 vim 缩进大括号

c - 函数调用期间不兼容的指针类型

c++ - Boost vector 与 STL vector

c++ - 访问说明符和性能

c++ - 使用 std::initialiser_list 显式初始化一个变量

c++ - 在顶部插入时双端队列是否提供 O(1) 复杂度

c++ - 将 int 存储为 ascii 代码的 vector

pointers - 通过指针访问类型后派生类型中 Fortran 字符串的奇怪行为

C++:指针与指针的指针在二叉树中插入节点