用唯一的成员id标识对象是个好主意吗?
Is it a good idea to identify objects by an unique member id?
我的问题是,我应该如何将对象相互关联。
有两个向量,vector<Baby> babies
和vector<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;
}
};
对不起,在你的问题中,我读到:
现在,每个婴儿有一个首选的玩具,每个玩具有一个首选的宝贝。
- 什么时候在C++中返回常量引用是个好主意
- 使用嵌套函数数组是个好主意吗?
- 将std::regex设置为静态的好主意吗
- 使用共享库进行变体处理是个好主意吗?
- 使用列表<Byte>不是好主意吗?
- 用C++编写多级内联函数是个好主意吗?
- 重载参数 C++ 是个好主意吗?
- 扩展 std::vector 是个好主意吗?
- 将 int32_t 键入为 int 是个好主意吗?
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 使用 QT 开发服务器应用程序是个好主意吗?(QT5)
- 用 constexpr 中的工会取代reinterpret_cast - 好主意?
- 将C 11设置功能更改为带有转发的现代模板功能是一个好主意
- 在哪里使用"std::valarray"是个好主意?
- std :: tr1 :: shared_ptr throw bad_alloc,也是一个好主意
- 在构造函数中循环C++是一个好主意吗?
- 重载指向集合的指针的开始/结束是否是个好主意
- 在构造函数中为另一个相同类型的对象构造对象是个好主意吗
- 使用可变参数模板创建传递新对象的更安全方式是否是个好主意
- 使用临时对象来完成一些任务,比如写日志是个好主意