对于小集合或地图,使用有序向量而不是基于树的set
/ map
通常要快得多 - 特别是对于5-10个元素。 LLVM有一些类in that spirit,但没有真正的适配器可以提供std::map
类似的接口,并使用std::vector
备份。
任何(免费)实现这个吗?
编辑:感谢所有其他想法,但我真的对基于矢量的集合/地图感兴趣。我确实有一些具体情况,我倾向于创建大量的通常少于10个元素的集合/映射,我确实希望减少内存压力。想想例如三角形网格中顶点的邻居边缘,您可以轻松地使用每组3-4个元素的100k组。
答案 0 :(得分:4)
我只是偶然发现了你的问题,希望不要太晚。
我推荐一个名为Loki的优秀(开源)库。 它有一个基于向量的关联容器实现,它是std :: map的替代品,名为AssocVector。
它为访问元素提供了更好的性能(以及插入/删除的最差性能)。
该图书馆由Andrei Alexandrescu的Modern C++ Design作者撰写。
它还包含一些其他非常好的东西。
答案 1 :(得分:3)
如果你找不到合适的东西,我只需要在insert上包装一个std :: vector来做sort(),并使用lower_bound()实现find()。它应该是直接的,并且与定制解决方案一样高效。
答案 2 :(得分:2)
我不知道任何这样的实现,但是有一些函数可以帮助处理已经在STL中的已排序向量,例如lower_bound
和upper_bound
。
答案 3 :(得分:2)
如果集合或映射确实很小,那么通过微优化数据结构获得的性能将几乎没有显着影响。在搜索一个小树和一个微小的向量时,你可以节省一两个内存(读取:缓存)查找,这在大图中是微不足道的。
话虽如此,你可以尝试一下hash_map。按键查找保证在固定时间内运行。
答案 4 :(得分:1)
旧帖子,我知道,但对于最近的访问者来说,Boost的flat_set和flat_map看起来就像你需要的那样。有关详细信息,请参阅https://theboostcpplibraries.com/boost.container。
答案 5 :(得分:0)
也许你正在寻找无序的地图和无序的集合。尝试查看依赖于散列的TR1无序容器或Boost.Unordered容器库。在界面下面,我不确定他们是否确实使用了std :: vector,但我打赌它值得一看。