提升flat_map容器
Boost flat_map container
在处理一些遗留代码时,我遇到了内存问题,主要原因是(我相信)STL映射的广泛使用(特别是" map -of-map ")。
我正在寻找Boost flat_map作为一个可能的解决方案。有没有人有使用flat_maps的第一手经验,特别是在速度和/或内存使用方面的改进?当然,我意识到这可能非常依赖于存储数据的类型和存储方式,但我仍然对人们的实际经验感到好奇。
谁能给我指出一些可靠的例子?作为一个例子:在这段代码中有几种map of a-map的情况;也就是说,一个值为另一个映射的映射。
通过用一对向量替换"内部"映射,我减少了10:1的内存占用(3G到300M)。当然,这可能会减慢搜索速度,但对于这种特殊情况,这似乎无关紧要。它涉及了大约一天的重构和仔细的测试。
Boost的flat_map听起来可能正是我需要的,但除了Boost网站上的类描述外,我似乎找不到更多关于它的信息。寻找一些第一手的反馈
Boost的flat_map
是一个基于二叉树的映射实现,除了二叉树是作为键值对的(排序)向量存储的。
基于这个事实,你基本上可以自己找出关于性能的答案(相对于std::map
):
- 迭代地图或它的大部分应该是超快的,相对
- 查找通常应该相对较快
- 添加或删除值理论上要慢得多,但在实践中-假设您的键和值类型很小并且地图元素的数量不是很高-可能在速度上相当(或者在小地图上甚至更好-通常不需要在插入时分配)
- 等。
在你的例子中-map -of-maps -你将失去一些"平坦化"的好处,因为你将有一个指向内部地图的指针的外部地图(如果不是更多的间接层次);但平面地图至少可以帮助你减少这种情况。此外,假设你有两层映射,你可以安排它,以便你存储所有的内部映射连续(要么通过适当地构造内部映射,要么通过用你自己的分配器实例化它们,这是一个更棘手的事情);在这种情况下,您可以用映射索引替换指向映射的指针,减少它们占用的空间,使编译器的工作更轻松。
您可能还需要阅读Boost的flat_map
文档;你也可以像我一样使用力来读取源(以及底层flat_tree
的源);我自己其实没有flat_map
的经验。
我知道这是一个老问题,但这可能对找到这个问题的人有用。
我发现flat_map
在搜索、查找和迭代大型地图方面有很大的改进。map使用内存中的连续数据这一事实也使得插入速度比您预期的要快,因为它具有良好的数据局部性。如果你在地图中做的插入多于查找,那么它可能不适合你。
话虽如此,由于数据的局部性,反复插入随机值到排序向量中比在链表中更快——尽管大O可能会告诉你什么。
- 从其他容器中移动构造"std::map"
- 我尝试使用MAP容器来映射资源,现在RESOURCEFILE正在获取所有信息.为什么
- 如何将 std::map 值复制到非容器数组中
- "map"容器C++是否对字符串的连续子字符串应用 Rabin-Karp 算法?
- 我可以在 map<char[2],class> 中使用类类型作为容器吗?
- 如何在 Map 中存储集合容器的迭代器列表
- 为什么 const 不适用于 stl map 的 size(),而它非常适合其他容器
- 获取std::map元素的有效方法是在容器中删除一个元素
- std::map或std::unordereded_map中的哪个容器适合我的情况
- 当通过const引用传递对象时,对象所发生的事情会被添加到类似std::map的容器中
- 如何作为类中的容器在std::map或std::unordereded_map之间切换
- 如何完全管理像map这样的std容器的堆内存分配
- 使用 std::set_symmetric_difference 时,STL 容器的模板类型基于 std::map<>::value_type
- 是否可以使用 std::p air 作为关联容器(如 std::map)的(唯一)模板参数
- 如何在map容器中插入set容器的值
- 给map vector容器的元素赋值时发生访问冲突
- 容器模板形参std::map或std::vector
- std::map::end 线程安全,并保证它对于同一容器始终相同
- Map /set迭代器不可解引用.多映射容器
- 向c++ map STL容器插入失败