C++笔记-brpc flatmap
待整理
参考资料:
https://www.hotaery.top/brpc/BRPC源码分析之容器篇——FLATMAP和FLATSET/#FlatMapIterator
https://blog.csdn.net/guangyacyb/article/details/104047730
https://illx10000.github.io/2019/01/20/12.html#2-flatmap
https://blog.csdn.net/whizchen/article/details/9286557
源码:
https://github.com/apache/incubator-brpc/blob/master/src/butil/containers/flat_map.h
https://github.com/apache/incubator-brpc/blob/master/src/butil/containers/flat_map_inl.h
https://github.com/apache/incubator-brpc/blob/master/docs/cn/flatmap.md
摘自flatmap.md
FlatMap可能是最快的哈希表,但当value较大时它需要更多的内存,它最适合作为检索过程中需要极快查找的小字典。
原理:把开链桶中第一个节点的内容直接放桶内。由于在实践中,大部分桶没有冲突或冲突较少,所以大部分操作只需要一次内存跳转:通过哈希值访问对应的桶。桶内两个及以上元素仍存放在链表中,由于桶之间彼此独立,一个桶的冲突不会影响其他桶,性能很稳定。在很多时候,FlatMap的查找性能和原生数组接近。
注意:
FlatMap的模板声明如下,FlatMap将会根据_Sparse的布尔值来决定选择迭代器类型。当_Sparse为
false时将会使用FlatMapIterator
作为其迭代器,这也是默认行为,当_Sparse
为true
时,将会使用SparseFlatMapIterator
作为迭代器类型,需要注意的是,SparseFlatMapIterator
作为迭代器类型时,FlatMap不支持多线程访问、插入或者删除。
template <typename _K, typename _T,
typename _Hash = DefaultHasher<_K>,
typename _Equal = DefaultEqualTo<_K>,
bool _Sparse = false>
class FlatMap;
多线程迭代FlatMap可能遇到不的问题
save_iterator
、restore_iterator
用于在多线程环境中用于将迭代大map的关键部分划分为较小的部分。 “不一致”是指:
在迭代过程中添加的元素可能会丢失。
某些元素可能会多次迭代。
调整map大小时,迭代器会在开始时重新开始。