首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >llvm::DenseMap和std::map的异同

llvm::DenseMap和std::map的异同
EN

Stack Overflow用户
提问于 2017-04-03 17:52:43
回答 1查看 2.9K关注 0票数 15

最近,我遇到了DenseMap数据结构,它在虚拟现实中得到了广泛的应用。我认为这是std::map(?)的某种优化版本。有人能帮我理解他们之间的区别或相似之处吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-30 22:11:47

llvm::DenseMapstd::unordered_map的替代品,所以它并不完全用于替换std::map (至少如果您已经根据有序属性和无序属性仔细选择了std::map)。

std::unordered_map不同,std::map保证容器的迭代顺序与您的比较器定义的顺序相匹配(默认情况下是std::less)。在很多情况下,你不关心迭代顺序.但在少数重要的情况下,DenseMap不是一种选择。

现在,将DenseMapstd::unordered_map进行对比:与std容器不同,DenseMap将其所有数据保存在一个内存分配中,并且取消存储桶,以便将键和值保持在内存中。这两个特性对于数据局部性来说都是一个巨大的胜利,因此在几乎所有的情况下都是快速的。

此外,DenseMap默认分配大量的键/值对(实际上是64),因此在小尺寸时,插入几乎是免费的。当然,这样做的缺点是,如果您创建了很多非常小的映射,或者您的类型本身很大,那么内存效率就很低;如果您的容器将永远增长到64个元素,那么您就是在浪费内存。根据您的用例,这可能会或不会对您造成实际伤害。

std::unordered_map相比,最后一个不同之处可能会让一些人措手不及:每次插入后,DenseMap的迭代器都会失效(与std::mapstd::unordered_map不同,后者只有当缓存重散时迭代器才失效)。我认为这主要是一个理论问题,因为您当然可以只存储密钥而不是迭代器。(与向量不同,找到保留映射迭代器的真正代码是相当罕见的。)

我已经收集了一些比较DenseMapstd容器的DenseMap,以及如果您想在自己的机器上运行基准测试的话GitHub回购。下面是四个选定的图表,显示不同尺寸的地图的插入和随机查找速度。

小地图中的插入速度

大地图中的插入速度

小地图中的随机查找

大型地图中的随机查找

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43191216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档