由 Facebook 开发和维护的 C++库 Folly 提供folly::sorted_vector_set
和folly::sorted_vector_map
,是std::map
和std::set
在小数据集上的优化版。代码见:
https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h。
folly::sorted_vector_set
和folly::sorted_vector_map
提供和std::map
和std::set
类似的 API ,大多数操作可以无缝切换。只是在实现上有区别:
std
的版本使用红黑树,结构复杂。而folly
的实现底层使用排序的std::vector
。结构更简单,内存连续,因此有更好的缓存命中率。std
的红黑树需要多余的内存空间来维护数结构。folly
的插入和删除都是O(n)
(找到位置是O(log(n)
,但需要移动后面所有的数据),而std
版本都是O(log(n))
。因此folly
的版本少量修改(最好只插不删)、大量查询的情形。查找的速度和std
版本一样都是O(log(n))
,但更直接,速度应该会稍快一些。folly
版本的插入和删除可能导致iterator
失效,但std
的版本不会。
这两个数据结构实现都比较直接,不多说了。
boost
也提供同样的数据结构,分别位于boost::container::flat_map
和boost::container::flat_set
。
不过根据我的测试,这些都不如std::unordered_set
和std::unordered_map
,后者的查找时间是O(1)
。
Q. E. D.