C++如何设置unordered_map键不存在时的默认值为double最大值
C++自定义unordered_map不存在键时的默认返回值实现
你需要的效果无法通过直接修改std::unordered_map的原生模板参数实现,因为标准库的operator[]语义是固定的:键不存在时值类型会做值初始化,double的值初始化结果固定为0。以下是两种可落地的实现方案:
方案1:独立取值函数(最推荐,无侵入)
该方案不修改原有map的定义,不破坏标准库原生语义,也不会向map中插入无意义的临时键值对,性能和原生访问几乎一致。
#include <limits> double getMapValue(const std::unordered_map<Pair, double>& mp, const Pair& key) { auto iter = mp.find(key); return iter != mp.end() ? iter->second : std::numeric_limits<double>::max(); }
调用方式:
// 访问不存在的Pair(3,3)时会直接返回double最大值 double res = getMapValue(lFunction, Pair(3, 3));
方案2:自定义包装类,保留[]调用语法
如果你希望继续使用map[key]的书写习惯,可以封装一个薄包装类,重写下标访问逻辑,同时透传你需要用到的原生unordered_map接口:
#include <limits> #include <unordered_map> #include <utility> class PairDoubleMap { private: std::unordered_map<Pair, double> inner_map_; public: // 透传常用接口 template<typename... Args> decltype(auto) insert(Args&&... args) { return inner_map_.insert(std::forward<Args>(args)...); } size_t erase(const Pair& key) { return inner_map_.erase(key); } size_t size() const noexcept { return inner_map_.size(); } bool contains(const Pair& key) const { return inner_map_.contains(key); } void clear() noexcept { inner_map_.clear(); } // 重写下标访问逻辑 double operator[](const Pair& key) { auto iter = inner_map_.find(key); if (iter != inner_map_.end()) { return iter->second; } // 若需要和原生[]一致:不存在时插入默认值,就放开下一行注释 // return inner_map_.emplace(key, std::numeric_limits<double>::max()).first->second; // 不需要插入就直接返回最大值 return std::numeric_limits<double>::max(); } double operator[](const Pair& key) const { auto iter = inner_map_.find(key); return iter != inner_map_.cend() ? iter->second : std::numeric_limits<double>::max(); } }; // 实例化替换原有定义即可 PairDoubleMap lFunction;
注意:不建议通过特化std命名空间下的组件、修改全局分配器等hack方式修改原生unordered_map的行为,这类写法不符合C++标准要求,可移植性差,升级编译器或切换标准库实现时极易出现难以排查的问题。
内容的提问来源于stack exchange,提问作者m6rco
相关产品推荐
相关产品推荐

