Boost multi_index:检索非唯一键的唯一值

时间:2011-02-16 13:00:02

标签: c++ boost boost-multi-index

我有一个boost::multi_index_container,其元素的结构如下:

struct Elem {
    A a;
    B b;
    C c;
};

主键(在数据库意义上)是composite_key ab。其他 存在用于执行各种类型查询的密钥。

我现在需要检索一组c的所有不同值。这些值是 无论如何唯一,但迭代所有条目(尽管是有序的), 或者使用std::unique似乎是一种浪费,考虑到这一点 预计c的不同值的数量<&lt;&lt;比总数 条目数(例如,10到1000)。

我错过了一种更有效地获得此结果的简单方法吗?

1 个答案:

答案 0 :(得分:1)

我搜索了Boost.MultiIndex文档,似乎无法找到一种方法来做你想要的。我很想知道它是否可行。

也许您可以做的最好的事情就是在std::map<C, size_t>旁边保留multi_index_container(或哈希地图)并保持两者“同步”。

地图将C值与其出现次数(频率)相关联。它本质上是C值的直方图。每次向Elem添加multi_index_container时,都会在直方图中增加相应的频率。从Elem中删除multi_index_counter时,会减少直方图中的相应频率。当频率达到零时,您将从直方图中删除该条目。

要检索不同C值的集合,您只需遍历直方图中的<key,value>对并查看每对中的key部分。如果您使用std::map,则不同的C值将排序。

如果您要仅检查一组不同的C值(或很少),那么我上面描述的方法可能有点过分。一种更简单的方法是将所有C值插入std::set<C>,然后遍历该集以检索不同的C值。

你说过,不同C的集合比C的总数要小得多。因此,std::set<C>方法应该比将C复制到std::vector,对向量进行排序,然后运行std::unique浪费更少的空间。

让我们比较复制到集合的时间复杂度与复制到向量,排序,然后运行unique。令N为C值的总数,并且令M为不同C值的数量。通过我的计算,设定的方法应该具有O(N * log(M))的时间复杂度。由于M很小并且随着N的增加不会增长很多,因此复杂性有效地变为O(N)。另一方面,排序+唯一技术的时间复杂度应为O(N * log(N))。