首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要std::unordered_map构造函数的示例

需要std::unordered_map构造函数的示例
EN

Stack Overflow用户
提问于 2013-03-25 01:20:53
回答 2查看 8.3K关注 0票数 1

假设我使用自己的类作为std::unordered_map的键

代码语言:javascript
运行
复制
class MyClass {
public:
    int a, b;
}

www.cplusplus.com列出了以下可以使用的构造函数:

代码语言:javascript
运行
复制
explicit unordered_map ( size_type n,
                         const hasher& hf = hasher(),
                         const key_equal& eql = key_equal(),
                         const allocator_type& alloc = allocator_type() );

您能举例说明如何使用上述构造函数并填充所有参数来构造我的std::unordered_map<MyClass, std::string>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-25 01:39:17

有一些three std::unordered_map constructors将散列和相等函数器的实例作为参数。此示例说明如何使用其中一种方法:

代码语言:javascript
运行
复制
struct MyHash {
  std::size_t operator()(const MyClass& k) const { .... }
};

struct MyEqual {
  bool operator()(const MyClass& lhs, const MyClass& rhs) const { .... }
};

std::unordered_map<MyClass, std::string, MyHash, MyEqual> m(42, // bucket count 
                                                            MyHash(), 
                                                            MyEqual());
票数 3
EN

Stack Overflow用户

发布于 2013-03-25 01:26:09

编写一个能够在unordered_map中用作键的类并不是免费的,他们需要一个自定义的散列对象来实现这一点。

代码语言:javascript
运行
复制
struct MyHash {
  std::size_t operator()(const MyClass& k) const
  {
    // You may want to use a better hash function
    return static_cast<std::size_t>(k.a) ^ static_cast<std::size_t>(k.b);
  }
}; 

然后,将散列函数作为模板参数传递给map (它使用默认构造函数构造散列对象,因此不需要手动传递):

代码语言:javascript
运行
复制
std::unordered_map<MyClass, std::string, MyHash> m;

或者,您可以在std名称空间中提供散列函数。

代码语言:javascript
运行
复制
namespace std {
  template <>
  struct hash<MyClass> {
    std::size_t operator()(const MyClass& k) const; // same as before
  };
}

现在,它完全如预期的那样:

代码语言:javascript
运行
复制
std::unordered_map<MyClass, std::string> m;

除了对unordered_map的特殊要求之外,您还需要定义一个operator==。即使这也可以通过模板参数进行自定义,我也建议将其编写为全局函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15601568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档