我相信我想使用boost::icl::interval_map来解决问题(如这里所述,如果interval_maps最终有效,我将发布完整的答案。)
我想使用interval_map<unsigned long long, set<foo*>>
,但boost::icl的文档提到存在潜在的效率问题(下面来自)。
我们使用字符串集的区间映射来引入interval_maps,因为它具有教学优势。party示例用于立即访问区间图和重叠聚合的基本思想。对于实际应用程序,不一定建议使用集合的interval_map。它与std::sets的std::map具有相同的效率问题。不过,将interval_maps与相关值的数字和其他有效数据类型一起使用是一个很大的领域。
std::set的std::map的效率问题是什么以及如何避免它们
std::map<K, V>
和std::set<V>
都是通过指针链接的基于节点的容器。遍历它们有很好的复杂性保证(即,每个单独的操作最多为O(logn)),但与std::vector<std::pair<K, V>>
相比,您实际上需要相当大的容器来处理复杂度,尤其是当K
和V
是基本类型时。基于节点的容器的主要性能问题是,它们或多或少地随机排列在内存中,而当代CPU喜欢访问以某种形式聚集的数据
当然,像往常一样,您需要测量在相当现实的数据集上不同实现之间获得的时间,以确定哪种数据结构产生最佳性能。