如何为std :: shared_ptr <t> type </t>实现std :: hash函数的特化

时间:2014-03-21 17:17:53

标签: c++11 hash

以下链接:http://en.cppreference.com/w/cpp/memory/shared_ptr/hash

让我认为默认情况下(没有为ptime类型编写适当的operator())我们不能将std::unordered_map作为键boost::posix::ptime类型,但我们可以使用{{ 1}}类型,是真的吗?

如何为shared_ptr实现散列函数?哈希函数的输入是底层指针的原始地址0xCBA ...和输出相应的哈希值?

1 个答案:

答案 0 :(得分:2)

  1. std::map根本不使用std::hash;我相信你在考虑std::unordered_map

  2. std::hash std::shared_ptr的部分特化是通过散列指针值而不是指向的值来实现的。它& #39;与通过散列存储在shared_ptr中的原始指针获得的哈希相同。

  3. 您当然可以创建一个由std::unordered_map键入的boost::posix::ptime。您有两种选择:specialize std::hash<boost::posix::ptime>,或者为std::unordered_map提供您自己的functor:

    struct TimeHash {
      std::size_t operator() (const boost::posix::ptime &t) const
      { return /* whatever */; }
    };
    
    std::unordered_map<boost::posix::ptime, AnyValueType, TimeHash> myMap;
    

  4. 关于编辑:所有标准指定是std::hash<std::shared_ptr<T>>()(sp) == std::hash<T*>()(sp.get())成立。换句话说,这意味着散列std::shared_ptr哈希存储在其中的指针(例如,而不是控制块)。 指针的精确完全取决于实现,即在标准库供应商上。