我发现自己处于一种必须按位置访问std :: map的情况。由于std::advance(iter, position)
速度很慢,我想添加第二个数据结构来加速此操作。
我的想法:为地图中的每个键值对保持一个向量。然后按位置vector[position]->second
访问向量。
当擦除/插入新元素时,我显然必须从向量中删除迭代器。但除此之外,std :: map的迭代器保留属性似乎已足够。
问题:这是个好主意吗?
替代方案:维护map::keys
的向量。然后按位置访问向量,使用键在地图中查找值map[vector[position]]
。这更聪明吗?
答案 0 :(得分:2)
如果通过map
的迭代是您的主要性能问题,那么您应该使用flat_map
(不是标准的一部分,但Boost有一个不错的标准)。如果您没有其中一个,只需使用您在vector<pair>
中使用的相同比较函数进行排序的map
。
您可以使用std::lower_bound
作为等效函数,以便能够通过其键找到值。您还可以使用从std::lower_bound
返回的迭代器作为执行单元素插入新元素的位置。其他一切都像其他vector
一样有效;只需保持它的排序,你会没事的。
答案 1 :(得分:1)
std::map
搜索,删除和插入操作具有对数复杂性。排序std::vector
不要使用地图,而是使用矢量。保持按键排序。按键进行二进制搜索是logaritgmic。按位置访问是最快的。
唯一的缺点是插入和删除需要内存重新分配。您可以测试其性能并考虑它是否值得。