败犬日报 2025-09-04
1. std::unordered_map<int*, int>
不能传常量指针
cpp
void foo(std::unordered_map<int*, int> &m, const int* key) {
m.find(key); // 报错
m.find(const_cast<int*>(key));
}
如果不能改 unordered_map 的类型,就只能每次都 const_cast 了。
如果能改,最简单的做法是 std::unordered_map<const int*, int>
。
也可以加透明查找,但是问题是:
- 需要 C++20。
- 得自己写一个资瓷 transparent hash 的工具类。
- 有一个理论的问题,标准没有保证
std::hash<int*>{}(ptr) == std::hash<const int*>{}(ptr)
始终为 true,实际上应该能跑。
代码如下:
cpp
struct MyTransparentHash {
using is_transparent = void;
template<typename T>
auto operator()(const T& x) const {
return std::hash<T>{}(x);
}
};
void foo(std::unordered_map<int*, int, MyTransparentHash, std::equal_to<>>& map,
const int* key) {
map.find(key);
}