我有一个简单的结构:
struct data
{
bool flag;
std::size_t ix;
std::size_t iy;
std::size_t d;
};
我将这个结构的所有实例都保存在容器中,我需要尽可能快地搜索它。目前,我使用std::set
基于字典比较的自定义比较函子。但是,我想尝试将我的数据存储在std::unordered_set
.
我用于boost::hash_combine
创建自定义哈希函子,但结果实际上比使用std::set
. 我现在想将结构中的所有数据打包unsigned long long
并使用标准std::hash
函子。所以一个想法是有类似的东西:
struct hashed_data
{
union
{
struct
{
bool flag;
std::size_t ix;
std::size_t iy;
std::size_t d;
} data;
unsigned long long value_to_hash;
};
};//hashed_data
问题是,我想确保我的结构确实适合unsigned long long
类型。我可以在限制范围内更改我的数据成员的类型:
ix
并且iy
小于 100,000(它们可能不适合 16 位整数,但 24 位已经绰绰有余,但是,没有标准的 24 位整数?)。
d
可以安全地属于一个char
类型。
我将不胜感激对这个问题的任何看法——想法是否合理以及如何实现我的目标。