使用std::unordered_map仅存指针键忽略值的相关问题咨询
问题解答
1. 无对应值存储场景下std::unordered_map的适用性
- 并不是最优选择,针对仅需存储唯一键、不需要关联值的场景,C++标准库专门提供了
std::unordered_set容器,本身就支持find()、count()等接口快速判断元素是否存在,完全匹配你记录已访问节点的需求,相比std::unordered_map没有冗余的value字段,内存开销更低,接口也更贴合使用场景。 - 如果受项目现有封装、历史代码限制必须使用
std::unordered_map也可以正常工作,只是属于非最优的冗余设计。
2. 指针类型的默认哈希函数适配效果
32位嵌入式系统下,标准库提供的指针原生哈希函数实现本质是直接将指针地址转换为整数作为哈希值,对于网格节点指针这类常规内存分配的场景,节点地址一般都是对齐分配的,不会出现大量哈希值低位重复的问题,碰撞概率极低,性能完全满足需求,不需要额外自定义哈希算法。自行实现的哈希算法反而容易引入不必要的碰撞风险,性能通常也不会优于默认实现。
3. std::unordered_map的value类型最优选择
如果你确实需要使用std::unordered_map而非std::unordered_set,可以按优先级选择以下value类型:
- 优先选择空结构体,C++标准支持空类优化,这种情况下value字段不会占用任何实际存储空间,是理论上性能最优的选择,仅需插入时给空结构体默认构造即可。
- 若编译器对空类优化支持不好,优先选择占用空间最小的
uint8_t类型,value统一存固定值(比如1)即可,更小的内存占用可以提升哈希表的缓存命中率,性能优于你考虑的uint32_t、uint_fast32_t。 - 如果考虑32位系统的地址对齐需求,选择
uint32_t即可,和32位系统的总线宽度对齐,存取效率和uint_fast32_t没有差异,不需要额外使用uint_fast32_t。
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

