c – Boost multi_index:检索非唯一键的唯一值
我有一个boost :: multi_index_container,其元素是这样的结构:
struct Elem { A a; B b; C c; }; 主键(在数据库意义上)是a和b的composite_key.其他 我现在需要检索一组c的所有不同值.这些值是 我错过了一种更有效地获得此结果的简单方法吗? 解决方法
我搜索了Boost.MultiIndex文档,似乎无法找到一种方法来做你想要的.我很想知道它是否可行.
也许你能做的最好的就是维护一个std :: map< C,size_t> (或哈希映射)与multi_index_container一起使用并保持它们“同步”. 该映射将C值与其出现次数(频率)相关联.它本质上是C值的直方图.每次将elem添加到multi_index_container时,都会增加直方图中的相应频率.从multi_index_counter中删除Elem时,会减小直方图中的相应频率.当频率达到零时,您从直方图中删除该条目. 要检索一组不同的C值,只需遍历< key,value>即可.在直方图中配对并查看每对的关键部分.如果你使用了std :: map,那么不同的C值将被排序. 如果您要仅检查一次(或很少)不同C值的集合,那么我上面描述的方法可能有点过分.更简单的方法是将所有C值插入到std :: set< C>中.然后遍历该集合以检索不同的C值. 你说过,不同C的集合比C的总数要小得多. std :: set< C>因此,方法应该比将C复制到std :: vector,排序向量,然后运行std :: unique浪费更少的空间. 让我们比较复制到集合的时间复杂度与复制到向量,排序,然后运行唯一.令N为C值的总数,并且令M为不同C值的数量.通过我的计算,设定的方法应该具有O(N * log(M))的时间复杂度.由于M很小并且随着N的增加不会增长很多,因此复杂性有效地变为O(N).另一方面,排序唯一技术应该具有O(N * log(N))的时间复杂度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |