部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

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作为其迭代器,这也是默认行为,当_Sparsetrue时,将会使用SparseFlatMapIterator作为迭代器类型,需要注意的是,SparseFlatMapIterator作为迭代器类型时,FlatMap不支持多线程访问、插入或者删除。

template <typename _K, typename _T,
          typename _Hash = DefaultHasher<_K>,
          typename _Equal = DefaultEqualTo<_K>,
          bool _Sparse = false>
class FlatMap;

多线程迭代FlatMap可能遇到不的问题
save_iteratorrestore_iterator
用于在多线程环境中用于将迭代大map的关键部分划分为较小的部分。 “不一致”是指:
在迭代过程中添加的元素可能会丢失。
某些元素可能会多次迭代。
调整map大小时,迭代器会在开始时重新开始。

posted @ 2020-06-15 16:47  流了个火  阅读(1334)  评论(0编辑  收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats