Google C++每周贴士 #136: 无序容器

本文介绍了C++中的无序容器unordered_map和unordered_set,它们提供了更高的效率和对哈希函数的控制。无序容器的元素指针在重新哈希时可能变得不稳定,因此不适合需要指针稳定性的场景。unordered_map和unordered_set提供了与map和set类似的API,易于迁移,而unordered_set额外提供了存储不可移动或复制对象的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(原文链接:https://abseil.io/tips/136 译者:clangpp@gmail.com)

每周贴士 #136: 无序容器

“Sometimes, when the material is really good, you put expectations on yourself to make it the best possible show. You’re not just serving up the regular hash and doing your job and going home.” — Peter Dinklage

长话短说:查看https://abseil.io/docs/cpp/guides/container以获取官方和最新的建议。本贴士 介绍 了这些新类型,但并不是权威参考。

介绍absl::*_hash_map

现在有一族新的关联容器到货了。它们自诩有效率提升,还尝鲜了C++17的API。它们还允许开发者直接控制实现细节和默认哈希函数,这些对代码库的长期演进很重要。新的代码应该尽量用这些类型而不是std::unordered_map。这一族map和set拥有与std::unordered_map几乎相同的API,所以迁移到它们很容易。

每一个absl::*_hash_map都有对应的absl::*_hash_set;但是,下面只会勾勒出map的情况,我们也总是指map

absl::flat_hash_mapabsl::flat_hash_set

Flat Hash Map Memory Layout

这应该是你的默认选项。它们把value_type存储在主数组之内。因为它们在重新计算哈希的时候会移动数据,所以元素指针并不稳定。如果你需要指针稳定性,或者你的数据很大,请考虑改用absl::node_hash_map,或者absl::flat_hash_map<Key, std::unique_ptr<Value>>,如果可能的话。

警告:因为rehash()之后指针不稳定,所以形如map["a"] = map["b"]的代码将会访问到非法内存。

absl::node_hash_mapabsl::node_hash_set

Node Hash Map Memory L ayout

这些容器在主数组以外的节点中申请value_type(正如std::unordered_map一样)。因为另行的申请,所以它们为存储的数据提供指针稳定性(存储在map里的对象的地址不发生变化),且空槽只需要8字节。另外,它们可以存储既不能移动又不能拷贝的东西。

我们一般建议你使用absl::flat_hash_map<K, std::unique_ptr<V>>而不是absl::node_hash_map<K, V>,对于node_hash_set也是一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值