-2

std::distance似乎很慢。我有一个大的多图并尝试使用equal_range公共键查找元素:

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

需要的std::distance时间比equal_range. 我天真地假设在进行 equal_range 时,距离是自动计算的。事实上,这是两个独立的计算。

有没有不同的方法来获取元素的总数equal_range

4

2 回答 2

2

std::multimap::equal_rangeisO(log <size of the container>)std::distanceisO(linear <size of the range>)并且std::multimap::count是这两者的总和。

这是完全合理的,因为对地图进行了排序,并且您需要访问范围内的每个元素来计算它们 - 所以除非您可以在解决方案中摆脱一些这种情况 - 对于您正在尝试做的事情来说,这看起来像是正常行为。

于 2019-07-29T17:00:17.273 回答
1

不; 可以实现一个标准映射类型构造,其中计算迭代器之间的距离为 O(lg n),但标准映射不实现它。而且改装它并不容易;编写自己的容器可能同样简单。

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


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

于 2019-07-29T18:51:29.543 回答