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/
也就是说,可以为Hash
和Pred
类模板的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(&unordered_hash)
和decltype(&unordered_eq)
用作Hash
和Pred
。该网站是正确的。
【参考方案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
使用默认值10
为n
。以上是关于std::unordered_map 的函数指针的主要内容,如果未能解决你的问题,请参考以下文章
在 std::unordered_map 中存储指向不同类型类的指针
std::hash 特化仍未被 std::unordered_map 使用