网站建设优化服务报价,网站 防 恶意注册,ui设计是什么部闿,长沙外贸企业网站建设关于C中的unordered_map和unordered_set不能直接以pair作为键名的问题
在 C STL 中#xff0c;不同于有序的 std::map 和 std::set 是基于红黑树实现的#xff0c;std::unordered_map 和 std::unordered_set 是基于哈希实现的#xff0c;在不要求容器内的键有序#xff0c…关于C中的unordered_map和unordered_set不能直接以pair作为键名的问题
在 C STL 中不同于有序的 std::map 和 std::set 是基于红黑树实现的std::unordered_map 和 std::unordered_set 是基于哈希实现的在不要求容器内的键有序仅要求查找效率较高时哈希实现的后者时更为合适的哈希表的运用也经常出现在各种算法题中。
但是我们知道既然是基于哈希实现的那么就需要指定哈希函数。对于内置的数据类型如 intfloatchar 等STL 库已经帮助我们内置了常用的哈希函数。因此通常我们在使用这些数据类型组成的 unordered_map 和 unordered_set 可以不再指定哈希函数直接用默认的。这在 unordered_map 的类模板定义中也可看到
template class Key, //容器中存储元素的类型class Hash hashKey, //确定元素存储位置所用的哈希函数class Pred equal_toKey, //判断各个元素是否相等所用的函数class Alloc allocatorKey //指定分配器对象的类型 class unordered_set;在这些参数重只有第一个参数是没有默认值的。也就是说在我们创建 int 、char 等内置类型的 unordered_set 时只需要传入存储在容器中的类型即可。
但是对于没有默认的哈希函数的类型如自定义的 class 类型pair 类型等我们就必须自己指定一个哈希函数。这也是为什么直接构建 pair 类型的 unordered_set 如 unordered_setpairint, int uset 会出现问题不会在声明时报错而是在 insert 等操作时。
对于这种情况我们只需要将上面的第二个参数确定元素存储位置所用的哈希函数也在声明时传入就行了。关于哈希函数的选择不同的情景会有所不同。这里笔者给出一个最简单的针对 pair 类型的哈希函数。
struct SimplePairHash {std::size_t operator()(const std::pairint, int p) const {return p.first ^ p.second;}
};在声明时直接将其传入即可
std::unordered_setstd::pairint, int, SimplePairHash S;
S.insert(std::make_pair(0, 1));Ref
https://stackoverflow.com/questions/21288345/unordered-set-of-pairs-compilation-error
https://blog.csdn.net/pineappleKID/article/details/108341064