std::unordered_map 的函数指针

Posted

技术标签:

【中文标题】std::unordered_map 的函数指针【英文标题】:function pointers for std::unordered_map 【发布时间】:2013-03-11 08:33:41 【问题描述】:

有这样的网站:

http://www.cplusplus.com/reference/unordered_map/unordered_map/

也就是说,可以为HashPred 类模板的Pred 参数提供函数指针,而不是类。但是,没有示例,如果可能的话,我还没有设法让这个功能发挥作用。非工作示例:

bool unordered_eq(const char* const s1, const char* const s2)

  return !std::strcmp(s1, s2);


std::size_t unordered_hash(char const* s)

  return std::hash<std::string>()(s);


std::unordered_map<char const*, std::string,
  unordered_hash, unordered_eq> hashmap;

【问题讨论】:

如果你想使用字符串作为键,为什么不使用std::string呢?它也适用于字符串文字。 只是一个例子,Key 可以是任何东西。无论如何,我同时知道答案,可以将decltype(&amp;unordered_hash)decltype(&amp;unordered_eq) 用作HashPred。该网站是正确的。 【参考方案1】:

也就是说,可以提供一个函数指针,而不是一个类

不,这是个误会。您可以向 constructor 提供函数指针而不是函数 object。模板参数仍然是一个类型——在这种情况下是函数指针的类型。所以,你必须写

typedef unordered_map<
            char const*, string,
            size_t(*)(char const*), // type for hashing
            bool(*)(char const*, char const*) // type for equality
        > yourmaptype;

yourmaptype hm (
        4, // minimum number of buckets
        &unordered_hash, // function address for hashing
        &unordered_eq, // function address for equality
    );

您的标准库为第一个参数定义了默认值,但该默认值未标准化。似乎没有办法保持您的供应商特定的默认值 n 并同时设置仿函数的值。我在这里使用 4 相当随意。

您应该考虑使用默认可构造函数对象。这不仅可以让您在不指定最小存储桶大小的情况下摆脱困境,而且还可能更快,因为仿函数非常更容易为编译器内联。

【讨论】:

为了记录,gcc 使用默认值10n

以上是关于std::unordered_map 的函数指针的主要内容,如果未能解决你的问题,请参考以下文章

在 std::unordered_map 中存储指向不同类型类的指针

迭代 unordered_map 时如何获取指向键的指针?

自定义 unordered_map 的哈希函数

std::hash 特化仍未被 std::unordered_map 使用

C++ std::unordered_map 中使用的默认哈希函数是啥?

std::unordered_map 析构函数不释放内存?