如何为std::unordered_map的自定义相等比较器传递初始化参数
解决方案
你的需求可以直接通过std::unordered_map的原生构造逻辑实现,无需借助全局变量。std::unordered_map的重载构造函数支持传入自定义的哈希器、相等比较器实例作为参数,你只需要提前构造好带HelperClass指针的KeyCompare实例,再传入map的构造函数即可。
正确实现代码
HelperClass helper; // 构造带helper指针的比较器实例 KeyCompare key_comp(&helper); /* * unordered_map构造参数说明: * 第一个参数:初始桶数量,可根据业务场景调整,填0使用默认值即可 * 第二个参数:哈希器实例,如果你的Hasher不需要自定义参数直接传默认构造的实例即可 * 第三个参数:自定义相等比较器实例 */ std::unordered_map<Key, Value, Hasher, KeyCompare> map(0, Hasher(), key_comp);
如果你的哈希器Hasher也需要携带自定义状态,和比较器的处理逻辑完全一致:提前构造好带参数的Hasher实例,再传入构造函数即可。
可选简化方案(C++20及以上)
如果不需要复用KeyCompare类,也可以直接用带状态的Lambda作为比较器,代码更简洁:
HelperClass helper; auto key_comp = [&helper](const Key& k1, const Key& k2) { return helper.doStuff(k1, k2); }; std::unordered_map<Key, Value, Hasher, decltype(key_comp)> map(0, Hasher(), key_comp);
注意事项
- 必须保证
HelperClass实例的生命周期长于对应的unordered_map实例,避免KeyCompare内部存储的指针悬空引发未定义行为。 - 你原来的写法编译失败的原因是默认构造
unordered_map时会尝试调用KeyCompare的无参构造函数,而你的KeyCompare没有提供无参构造,手动传入实例即可规避该问题。
内容的提问来源于stack exchange,提问作者multitaskPro
相关产品推荐
相关产品推荐

