在C ++中关联3件事的最好方法

时间:2016-10-12 13:55:10

标签: c++ stl

在我的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>的多个哈希表,但这似乎很难维护。

3 个答案:

答案 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,BC进行排序或散列。

使用这种数据结构,您可以在该类上编写所需的任何查询方法,并且实现应始终简单快捷。

向元组数组添加新元素很简单。映射本质上只是允许快速查找的缓存。如果实例ABC可以包含多个元组,则事情会变得更棘手,您可能需要映射到vector size_t

在此设计中添加D也非常简单。

如果您需要某些关系而没有其中一个类,则可以将tuple替换为variant

答案 1 :(得分:2)

Boost Multi-index Containers Library似乎非常接近你想要的。从介绍:

  

Boost Multi-index Containers Library提供了一个名为multi_index_container的类模板,它可以构建容器,维护一个或多个具有不同排序和访问语义的索引。

。 。

  

Boost.MultiIndex的多功能特性允许指定各种不同的数据结构。以下是文档中使用的可能的使用示例:

  • 使用多个迭代订单和搜索条件进行设置。
  • 快速查找和/或没有重复的列表。
  • 双向地图,即可搜索关键字或值的地图。 MRU(最近使用过的)列表,结构保留最后引用的项目,从最新的项目开始。
  • 利用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仍然有效。