我有一个boost::multi_index_container
,其元素的结构如下:
struct Elem {
A a;
B b;
C c;
};
主键(在数据库意义上)是composite_key
a
和b
。其他
存在用于执行各种类型查询的密钥。
我现在需要检索一组c
的所有不同值。这些值是
无论如何不唯一,但迭代所有条目(尽管是有序的),
或者使用std::unique
似乎是一种浪费,考虑到这一点
预计c
的不同值的数量<&lt;&lt;比总数
条目数(例如,10到1000)。
我错过了一种更有效地获得此结果的简单方法吗?
答案 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))。