C++多索引映射实现

SU3*_*SU3 5 c++ dictionary tuples c++11

我正在 C++11 中实现多索引映射,我希望针对特定功能对其进行优化。我目前正在尝试解决的问题是不要多次存储关键元素。但让我解释一下。

问题来自对直方图进行排序以将它们以不同的组合覆盖。直方图有名称,可以拆分为标记(属性)。

以下是我希望我的房产地图具有的功能:

  1. 能够以任何顺序循环属性;
  2. 能够为每个属性返回具有唯一值的容器;
  3. 按属性值到达的顺序累积属性值,但能够在填充地图后使用自定义比较运算符对属性进行排序;

我有一个工作实现在C ++ 11使用std::unordered_mapstd::tuple作为key_type。当属性值到达一个 forward_lists 元组时,我正在累积它们。预期用途是遍历列表以组合键。

我想介绍的优化是只将属性的值存储在列表中,而不是将它们存储在用作映射键的元组中。我想保持让函数返回对属性值列表的常量引用的能力,而不是一些包装器的列表。

我知道boost::multi_index具有类似的功能,但我不需要在键到达时进行排序的开销。我希望按顺序存储新的属性值,并且只能在事后排序。我也看过boost::flyweight,但在最简单的方法中,列表将是 offlyweight<T>而不是T,我不想这样做。(如果这是最好的解决方案,我绝对可以接受。)

我知道列表是稳定的,即一旦创建了一个元素,它的指针和迭代器仍然有效,即使在调用list::sort(). 知道这一点,可以对地图做些什么来消除元组元素的冗余副本吗?自定义地图分配器可以在这里提供帮助吗?

感谢您的建议。

Yak*_*ont 3

让你的映射从迭代器元组到你的 prop 容器。

编写一个散列,取消引用迭代器并组合结果。

将前向列表属性容器替换为首先按哈希排序,然后是内容的集合。

首先在集合中查找,然后在哈希中查找。

如果您需要不同的 props 顺序,请使用另一个集合迭代器容器。