【问题标题】:Using string* as a key in an unordered_set使用 string* 作为 unordered_set 中的键
【发布时间】:2011-03-20 23:10:52
【问题描述】:

我想将使用字符串* 作为 unordered_list 中的键。我不想要指针本身的哈希值,而是它指向的字符串。

我知道我需要创建一个这样的结构:

struct myhash{
    size_t operator()(const string * str){
        return hash(*str);
    }
}

并将其作为哈希发送到地图模板,但我不确定如何。

【问题讨论】:

  • 您是否有理由必须使用string* 而不是string?如果您使用string,那么unordered_list 将正确处理string 的生命周期。如果您使用string*,那么您将不得不处理生命周期。确保你真的从接受该任务中得到一些东西(生命周期管理)。
  • 如果您的问题已得到解答,请单击对勾。 :) 另外,请考虑Max 所说的:您必须手动管理这些生命周期,这很糟糕。 (所以只要指针是非拥有的就可以了。)如果它们是拥有的,请使用shared_ptrunique_ptr

标签: c++ hash map unordered-map


【解决方案1】:

基本上就是这样。然后将它作为第三个模板参数提供给unordered_map 类型(我将假设它是 C++0x 类型)。我会概括它,以便它可以在任何情况下使用,而不仅仅是string

struct dereference_hash
{
    template <typename T>
    std::size_t operator()(const T* pX)
    {
        return std::hash<T>()(*pX);
    }
};

typedef std::unordered_map<std::string*, int, dereference_hash> map_type;

【讨论】:

  • 谢谢,它有效。一个小的更正:返回 std::hash(*pX);
  • @izex:哎呀,你是对的我错了,但你的意思是std::hash&lt;T&gt;()(*pX)
猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2015-08-05
  • 2022-06-13
  • 2019-05-29
相关资源
最近更新 更多