与map和unordered_map相比,boost :: flat_map及其性能

时间:2014-01-16 15:58:27

标签: c++ boost map

编程中的常识是,由于缓存命中,内存局部性会大大提高性能。我最近发现了boost::flat_map这是一个基于矢量的地图实现。它似乎不像您的典型map / unordered_map那样受欢迎,因此我无法找到任何性能比较。它如何比较以及它的最佳用例是什么?

谢谢!

1 个答案:

答案 0 :(得分:6)

从文档来看,这似乎与Loki::AssocVector类似,我是一个相当重要的用户。因为它基于向量,所以它具有向量的特征,也就是说:

  • 只要size增长到capacity以后,迭代器就会失效。
  • 当它超过capacity时,它需要重新分配并移动对象,即插入不能保证恒定时间,除了endcapacity > size插入的特殊情况
  • 由于缓存局部性,查找速度比std::map快,二进制搜索具有与std::map相同的性能特征,否则
  • 使用较少的内存,因为它不是链接的二进制树
  • 除非你强行告诉它(因为这会触发重新分配),否则它永远不会缩小。

最好的用法是事先知道元素的数量(因此可以reserve预先),或者插入/删除很少但查找频繁。迭代器失效使得它在某些用例中有点麻烦,因此它们在程序正确性方面不可互换。