加快对std :: map的位置访问

时间:2018-06-08 23:33:05

标签: c++ stl stdvector stdmap

我发现自己处于一种必须按位置访问std :: map的情况。由于std::advance(iter, position)速度很慢,我想添加第二个数据结构来加速此操作。

我的想法:为地图中的每个键值对保持一个向量。然后按位置vector[position]->second访问向量。

当擦除/插入新元素时,我显然必须从向量中删除迭代器。但除此之外,std :: map的迭代器保留属性似乎已足够。

问题:这是个好主意吗?

替代方案:维护map::keys的向量。然后按位置访问向量,使用键在地图中查找值map[vector[position]]。这更聪明吗?

2 个答案:

答案 0 :(得分:2)

如果通过map的迭代是您的主要性能问题,那么您应该使用flat_map(不是标准的一部分,但Boost有一个不错的标准)。如果您没有其中一个,只需使用您在vector<pair>中使用的相同比较函数进行排序的map

您可以使用std::lower_bound作为等效函数,以便能够通过其键找到值。您还可以使用从std::lower_bound返回的迭代器作为执行单元素插入新元素的位置。其他一切都像其他vector一样有效;只需保持它的排序,你会没事的。

答案 1 :(得分:1)

std::map搜索,删除和插入操作具有对数复杂性。排序std::vector

可以实现相同的复杂性

不要使用地图,而是使用矢量。保持按键排序。按键进行二进制搜索是logaritgmic。按位置访问是最快的。

唯一的缺点是插入和删除需要内存重新分配。您可以测试其性能并考虑它是否值得。