C++多索引映射实现

C++ multi-index map implementation

本文关键字:实现 映射 索引 C++      更新时间:2023-10-16

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

这个问题产生于对直方图进行排序,以将它们以不同的组合覆盖。直方图有名称,这些名称可以划分为标记(属性)。

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

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

我在C++11中有一个使用std::unordered_mapstd::tuple作为key_type的工作实现。当属性值到达forward_list的元组时,我正在累积它们。其预期用途是对列表进行迭代以组成键。

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

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

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

谢谢你的建议。

让您的映射从迭代器的元组到您的道具容器。

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

将正向列表道具容器替换为先按哈希排序,然后按内容排序的集合。

先在集合中查找,然后在散列中查找。

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