std::distance 很慢,如何改善呢?

std::distance is slow and how to improve it?

std::distance好像很慢。我有一个大型多图并尝试使用 equal_range 来查找具有公共键的元素:

auto range = in_map.equal_range(neuron_with_spikes[i]); 
int count = std::distance(range.first, range.second); 

std::distanceequal_range 花费更多时间。 天真地我会假设在做 equal_range 时,距离是自动计算的。其实是两个独立的计算。

是否有不同的方法来获取 equal_range 的元素总数?

std::multimap::equal_rangeO(log <size of the container>)std::distanceO(linear <size of the range>)std::multimap::count 是这两者的总和。

这是完全合理的,因为地图已排序,您需要访问范围内的每个元素以对它们进行计数 - 因此除非您可以在解决方案中删除一些 this - 看起来像您的正常行为试图做。

否;可以实现一个 std map 类型构造,其中计算迭代器之间的距离是 O(lg n),但 std maps 不实现它。改造它并不容易;编写自己的容器可能同样简单。

在这样一个修改后的映射中,平衡二叉树跟踪下的总节点数;这为树变异和内存使用增加了一个恒定的开销因子,但是在 O 表示法中 none。


最简单的方法,因为你只需要计数而不需要距离,可能是用从键到元素向量的映射替换你的多重映射;并手动管理元素的向量。距离为 O(n) 但计数变为 O(lg n)。