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
?我是否应该尝试更多现成的东西?我的一些解决方案有希望吗?(哪位专家会选择?
最佳解决方案是否“取决于”访问/查询模式 与链接属性的多对多关系是无向图。图形实现的所有选项都适用。对象的图形术语是“节点”。关系对是“边”
- 矩阵:从索引映射对象。例如,使用指针或引用数组获取对象的索引,然后在程序中传递索引以引用对象。将边表示为属性记录的方形矩阵。因为图形是无向的,所以矩阵可以是三角形的。虽然使用此方法更改节点计数的成本很高,但仍然存在一些问题。另一种方法是使用指向不同长度行的指针数组
- 邻接列表:使用与上述相同的索引->对象映射数组。将邻接表示为一组索引的数组。同样,由于图形是无向的,您只需要存储邻接对
wherei->j
i如果您关心按下哪个操纵杆的按钮,那么每个操纵杆都有自己的按钮。我不认为你想要操纵杆和按钮之间的多对多关系。每个操纵杆都有自己的按钮。@John很抱歉不清楚。按钮在屏幕上。它们不是操纵杆硬件按钮。我已经编辑了这个问题。很好。。。。将问题解释为符合更标准的问题,然后解决它。。。真是天才。。。。