在我的C ++应用程序中,我遇到一个问题,我需要关联3个内容并查找它们或迭代任何一个列。
假设我有3个A,B,C类,A可以是B / C对的两个或三个组合。我希望能够找到所有与B相关的As,每个A的所有B-C对,或者给定A和C的每个B.
除了有一个std :: tuple的向量并对整个列表进行线性迭代之外,这对我来说并不明显,但我更喜欢使用哈希表来访问。我想到的另一种方法就是简单地创建A -> vector<pair<B,C>>
,B -> vector<pair<A,C>
的多个哈希表,但这似乎很难维护。
答案 0 :(得分:2)
我之前已经编写了代码来解决一个潜在的类似问题,我这样做了就好了(到目前为止)。
在某些课程中:
您可以存储vector
tuple
之类的内容:
vector<tuple<A, B, C>> tuple_array;
散列访问的映射只是指向元组索引,如:
map<A, size_t> a_mapping;
map<B, size_t> b_mapping;
map<C, size_t> c_mapping;
在类的构造函数中,您可以非常简单地派生映射。这假设可以对A
s,B
和C
进行排序或散列。
使用这种数据结构,您可以在该类上编写所需的任何查询方法,并且实现应始终简单快捷。
向元组数组添加新元素很简单。映射本质上只是允许快速查找的缓存。如果实例A
,B
或C
可以包含多个元组,则事情会变得更棘手,您可能需要映射到vector
size_t
在此设计中添加D
也非常简单。
如果您需要某些关系而没有其中一个类,则可以将tuple
替换为variant
。
答案 1 :(得分:2)
Boost Multi-index Containers Library似乎非常接近你想要的。从介绍:
Boost Multi-index Containers Library提供了一个名为multi_index_container的类模板,它可以构建容器,维护一个或多个具有不同排序和访问语义的索引。
。 。
Boost.MultiIndex的多功能特性允许指定各种不同的数据结构。以下是文档中使用的可能的使用示例:
答案 2 :(得分:0)
你可以维持std::list
三倍。然后在列表顶部添加三个std::unordered_map<std::reference_wrapper<>, std::list::iterator>
。
使用list
优于vector
的优势在于,您可以有效地插入/删除/更新集合。
使用std::reference_wrapper<>
作为关键字的优势在于您不会重复存储A / B / C值。
使用list::iterator
的好处是可以直接访问三元组。此外,由于list
是基于指针的,因此在插入/删除某些列表项后,剩余的list::iterators
仍然有效。