在C ++中无序设置,为什么需要哈希?

时间:2015-04-24 10:16:35

标签: c++ hash set

我只想在无序集中存储几个对象。 创建几个集,

auto set1 = std::unordered_set<Myclass>();

我有时会遇到这样的错误:

  

未定义模板的隐式实例化&#st; :: __ 1 :: hash&#39;

除了unordered_set之外,没有其他替代品可以开箱即用吗?为什么&#34;哈希&#34;需要的?

1 个答案:

答案 0 :(得分:4)

std::unordered_set通过散列您使用的密钥来索引其存储中的值,就像哈希表或C ++ std::unordered_map实现一样。

如果您不想为Myclass编写哈希函数,请改用std::set。这可能比定义哈希函数并使用std::unordered_set更糟糕,但如果您的类很难编写哈希函数,则可能是值得的。取决于课程和你的申请。

如果您想使用std::unordered_set,则需要为Myclass提供哈希函数。为您的班级提供std::hash的专业化,或为std::unordered_set提供哈希政策。

//specialize std::hash
namespace std
{
    template<>
    struct hash<Myclass>
    {
        typedef Myclass argument_type;
        typedef std::size_t result_type;

        result_type operator()(argument_type const& s) const
        {
            //some code to hash a Myclass object
        }
    };
}
auto set1 = std::unordered_set<Myclass>();   

//hashing policy version
class MyclassHash
{
public:
    std::size_t operator()(Myclass const& s) const 
    {
        //some code to hash a Myclass object
    }
};
auto set1 = std::unordered_set<Myclass, MyclassHash>();