我在C ++ 11中实现了一个多索引映射,我希望针对特定功能进行优化。我目前试图解决的问题是不再存储一次关键元素。但让我解释一下。
问题产生于排序直方图以不同的组合覆盖它们。直方图有名称,可以分成标记(属性)。
以下是我希望我的属性地图具有的功能:
我在C ++ 11中使用std::unordered_map
working implementation,std::tuple
为key_type
。当我们到达一个forward_lists元组时,我会累积属性值。预期用途是迭代列表以组成密钥。
我想介绍的优化是,只存储属性'列表中的值,而不是将它们存储在用作映射中的键的元组中。我希望能够让函数返回const引用到属性值列表,而不是一些包装器的列表。
我知道boost::multi_index具有相似的功能,但是当密钥到达时,我不需要排序的开销。我希望按顺序存储新的属性值,并且只能在事后进行排序。我还查看了boost::flyweight,但最简单的方法是,列表将是flyweight<T>
而不是T
,我不想这样做。 (如果这是最好的解决方案,我绝对可以忍受它。)
我知道列表是稳定的,即一旦创建了一个元素,它的指针和迭代器仍然有效,即使在调用list::sort()
之后也是如此。知道了,可以对地图做些什么来消除元组元素的冗余副本吗?自定义地图分配器可以在这帮助吗?
感谢您的建议。
答案 0 :(得分:1)
让你的地图从迭代器的元组到你的道具容器。
写一个散列,取消引用迭代器并组合结果。
将前向列表道具容器替换为首先按哈希定义的集合,然后是内容。
首先在集合中查找,然后在哈希中进行查找。
如果你需要一个不同的道具订单,请使用另一个设置迭代器的容器。