C++ 数据结构:多(A)对多(B)关系,每个链接也有自己的数据(C)

C++ 数据结构:多(A)对多(B)关系,每个链接也有自己的数据(C),c++,data-structures,hashmap,C++,Data Structures,Hashmap,什么样的数据结构适合保持多对多关系(a-B),关系的每个链接都有自己的用户数据(C) 我最关心的是表现 例1 场景中有许多2D圆。 它们可以相互增长和重叠(圆圈A&圆圈B)。 我必须跟踪重叠区域(C),例如颜色 例2 有许多投资者(A)和股票(B)。 每个投资者(A)对一家公司(B)拥有%的所有权/职业(C) 例3 这是一个真实的情况。我不认为你需要读它。 我提供它只是以防万一 我使用的是基于实体组件的体系结构 有许多操纵手柄(A),每个操纵手柄都可以单击按钮(B) 请注意,按钮(B)是游戏屏幕

什么样的数据结构适合保持多对多关系(
a
-
B
),关系的每个链接都有自己的用户数据(
C

我最关心的是表现

例1 场景中有许多2D圆。
它们可以相互增长和重叠(
圆圈A
&
圆圈B
)。
我必须跟踪重叠区域(
C
),例如颜色

例2 有许多投资者(
A
)和股票(
B
)。
每个投资者(
A
)对一家公司(
B
)拥有%的所有权/职业(
C

例3 这是一个真实的情况。我不认为你需要读它。
我提供它只是以防万一

我使用的是基于实体组件的体系结构

有许多操纵手柄(
A
),每个操纵手柄都可以单击按钮(
B

请注意,按钮(
B
)是游戏屏幕上的按钮。(不是操纵手柄硬件按钮)

我必须跟踪(使用
C
)按钮是否被操纵杆“悬停”,并执行回调

我必须跟踪的原因之一是:是否应该回调有标准。
它与标准Windows按钮相同:-

  • 按钮在悬停时被释放。。。而且
  • 开始单击时,相同的按钮悬停
另一个原因是:鼠标可以同时悬停多个按钮。我还必须记录悬停的持续时间。(用于图形)

A
B
C
都是组件

编译时不知道
A
B
的数量

我拙劣的解决方案 第一个解决方案:

HashMap<A*,HashMap<B*,C*>> database;
class CustomStruct{  A* a; B* b; }
HashMap<CustomStruct,C*> database;
HashMap<A*,C*> databaseAC;
HashMap<B*,C*> databaseBC;
class A{HashMap<B*,C*> databaseBC;};
class B{HashMap<A*,C*> databaseAC;};
无法从
A
高效地查询
C

第三种解决方案:

HashMap<A*,HashMap<B*,C*>> database;
class CustomStruct{  A* a; B* b; }
HashMap<CustomStruct,C*> database;
HashMap<A*,C*> databaseAC;
HashMap<B*,C*> databaseBC;
class A{HashMap<B*,C*> databaseBC;};
class B{HashMap<A*,C*> databaseAC;};
可能很好

其他想法:

HashMap<A*,HashMap<B*,C*>> database;
class CustomStruct{  A* a; B* b; }
HashMap<CustomStruct,C*> database;
HashMap<A*,C*> databaseAC;
HashMap<B*,C*> databaseBC;
class A{HashMap<B*,C*> databaseBC;};
class B{HashMap<A*,C*> databaseAC;};
我是否应该使用
HashMap
?我是否应该尝试更多现成的东西?
我的一些解决方案有希望吗?(哪位专家会选择?

最佳解决方案是否“取决于”访问/查询模式

与链接属性的多对多关系是无向图。图形实现的所有选项都适用。对象的图形术语是“节点”。关系对是“边”

  • 矩阵:从索引映射对象。例如,使用指针或引用数组获取对象的索引,然后在程序中传递索引以引用对象。将边表示为属性记录的方形矩阵。因为图形是无向的,所以矩阵可以是三角形的。虽然使用此方法更改节点计数的成本很高,但仍然存在一些问题。另一种方法是使用指向不同长度行的指针数组


  • 邻接列表:使用与上述相同的索引->对象映射数组。将邻接表示为一组索引的数组。同样,由于图形是无向的,您只需要存储邻接对
    i->j
    where
    i如果您关心按下哪个操纵杆的按钮,那么每个操纵杆都有自己的按钮。我不认为你想要操纵杆和按钮之间的多对多关系。每个操纵杆都有自己的按钮。@John很抱歉不清楚。按钮在屏幕上。它们不是操纵杆硬件按钮。我已经编辑了这个问题。很好。。。。将问题解释为符合更标准的问题,然后解决它。。。真是天才。。。。