是否已经有一些基于std :: vector的set / map实现?

时间:2009-01-16 09:51:48

标签: c++ optimization

对于小集合或地图,使用有序向量而不是基于树的set / map通常要快得多 - 特别是对于5-10个元素。 LLVM有一些类in that spirit,但没有真正的适配器可以提供std::map类似的接口,并使用std::vector备份。

任何(免费)实现这个吗?

编辑:感谢所有其他想法,但我真的对基于矢量的集合/地图感兴趣。我确实有一些具体情况,我倾向于创建大量的通常少于10个元素的集合/映射,我确实希望减少内存压力。想想例如三角形网格中顶点的邻居边缘,您可以轻松地使用每组3-4个元素的100k组。

6 个答案:

答案 0 :(得分:4)

我只是偶然发现了你的问题,希望不要太晚。

我推荐一个名为Loki的优秀(开源)库。 它有一个基于向量的关联容器实现,它是std :: map的替代品,名为AssocVector

它为访问元素提供了更好的性能(以及插入/删除的最差性能)。

该图书馆由Andrei AlexandrescuModern C++ Design作者撰写。

它还包含一些其他非常好的东西。

答案 1 :(得分:3)

如果你找不到合适的东西,我只需要在insert上包装一个std :: vector来做sort(),并使用lower_bound()实现find()。它应该是直接的,并且与定制解决方案一样高效。

答案 2 :(得分:2)

我不知道任何这样的实现,但是有一些函数可以帮助处理已经在STL中的已排序向量,例如lower_boundupper_bound

答案 3 :(得分:2)

如果集合或映射确实很小,那么通过微优化数据结构获得的性能将几乎没有显着影响。在搜索一个小树和一个微小的向量时,你可以节省一两个内存(读取:缓存)查找,这在大图中是微不足道的。

话虽如此,你可以尝试一下hash_map。按键查找保证在固定时间内运行。

答案 4 :(得分:1)

旧帖子,我知道,但对于最近的访问者来说,Boost的flat_set和flat_map看起来就像你需要的那样。有关详细信息,请参阅https://theboostcpplibraries.com/boost.container

答案 5 :(得分:0)

也许你正在寻找无序的地图和无序的集合。尝试查看依赖于散列的TR1无序容器或Boost.Unordered容器库。在界面下面,我不确定他们是否确实使用了std :: vector,但我打赌它值得一看。