C ++多索引映射实现

时间:2015-03-04 22:43:51

标签: c++ c++11 dictionary tuples

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

问题产生于排序直方图以不同的组合覆盖它们。直方图有名称,可以分成标记(属性)。

以下是我希望我的属性地图具有的功能:

  1. 能够以任何顺序遍历属性;
  2. 能够为每个属性返回具有唯一值的容器;
  3. 累积物业'值按照它们到达的顺序排列,但是可以在填充地图后使用自定义比较运算符对属性进行排序;
  4. 我在C ++ 11中使用std::unordered_map working implementationstd::tuplekey_type。当我们到达一个forward_lists元组时,我会累积属性值。预期用途是迭代列表以组成密钥。

    我想介绍的优化是,只存储属性'列表中的值,而不是将它们存储在用作映射中的键的元组中。我希望能够让函数返回const引用到属性值列表,而不是一些包装器的列表。

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

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

    感谢您的建议。

1 个答案:

答案 0 :(得分:1)

让你的地图从迭代器的元组到你的道具容器。

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

将前向列表道具容器替换为首先按哈希定义的集合,然后是内容。

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

如果你需要一个不同的道具订单,请使用另一个设置迭代器的容器。

相关问题