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