Qt:如何为QColor实现一个散列函数?
Qt: how to implement a hash function for QColor?
我需要用std::pair<QColor, char>
作为unordered_map
的key。至于pair
,我知道有boost功能可以用,但是颜色呢?仅在 std 命名空间中提供哈希模板就足够了吗?如果是这样,那么作为哈希基础的颜色的最佳属性是什么,以最大限度地提高性能并最大限度地减少冲突?我的第一个想法是关于简单 name()
。如果是
namespace std {
struct hash<Key>
{
std::size_t operator()(const Key& k) const {
return std::hash<std::string>()(k.name());
}
}
以上代码摘自C++ unordered_map using a custom class type as the key.
您的提议可能会奏效(尽管您必须将颜色名称从 QString
转换为 std::string
),我会直接使用颜色的 RGBA 值。它比必须通过 QString
到 std::string
构造和哈希计算便宜一点:
template<>
struct std::hash<QColor>
{
std::size_t operator()(const QColor& c) const noexcept
{
return std::hash<unsigned int>{}(c.rgba());
}
};
根据 Qt 的文档,QRgb returned by QColor::rgba() 是某种等同于 unsigned int
的类型。
我需要用std::pair<QColor, char>
作为unordered_map
的key。至于pair
,我知道有boost功能可以用,但是颜色呢?仅在 std 命名空间中提供哈希模板就足够了吗?如果是这样,那么作为哈希基础的颜色的最佳属性是什么,以最大限度地提高性能并最大限度地减少冲突?我的第一个想法是关于简单 name()
。如果是
namespace std {
struct hash<Key>
{
std::size_t operator()(const Key& k) const {
return std::hash<std::string>()(k.name());
}
}
以上代码摘自C++ unordered_map using a custom class type as the key.
您的提议可能会奏效(尽管您必须将颜色名称从 QString
转换为 std::string
),我会直接使用颜色的 RGBA 值。它比必须通过 QString
到 std::string
构造和哈希计算便宜一点:
template<>
struct std::hash<QColor>
{
std::size_t operator()(const QColor& c) const noexcept
{
return std::hash<unsigned int>{}(c.rgba());
}
};
根据 Qt 的文档,QRgb returned by QColor::rgba() 是某种等同于 unsigned int
的类型。