以下链接:http://en.cppreference.com/w/cpp/memory/shared_ptr/hash
让我认为默认情况下(没有为ptime类型编写适当的operator())我们不能将std::unordered_map
作为键boost::posix::ptime
类型,但我们可以使用{{ 1}}类型,是真的吗?
如何为shared_ptr实现散列函数?哈希函数的输入是底层指针的原始地址0xCBA ...和输出相应的哈希值?
答案 0 :(得分:2)
std::map
根本不使用std::hash
;我相信你在考虑std::unordered_map
。
std::hash
std::shared_ptr
的部分特化是通过散列指针值而不是指向的值来实现的。它& #39;与通过散列存储在shared_ptr
中的原始指针获得的哈希相同。
您当然可以创建一个由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;
关于编辑:所有标准指定是std::hash<std::shared_ptr<T>>()(sp) == std::hash<T*>()(sp.get())
成立。换句话说,这意味着散列std::shared_ptr
哈希存储在其中的指针(例如,而不是控制块)。 指针的精确完全取决于实现,即在标准库供应商上。