【问题标题】:Defining hash and equality functions for nonstandard objects为非标准对象定义散列和相等函数
【发布时间】:2017-02-03 18:43:49
【问题描述】:

我在为对象定义哈希和相等函数时遇到了一些麻烦。我将这些对象用作std::unordered_map 的键。我有两个键 aKeyunaccessibleKey。我可以向aKey 添加一个等式运算符重载,但我不能向unaccessibleKey 添加一个等式运算符重载,因为它“无法访问”。我已尝试执行以下操作,但我不确定我是否对所有内容都使用了正确的语法,而且我不知道如何为unaccessibleKey 定义相等函数。这是我尝试过的:

struct aKeyHash
{
   std::size_t operator()(const aKey& k) const
   {
      return k.getnonconstmem()->nonconstfunc();
   };
}

struct unaccessibleKeyHash
{
   std::size_t operator()(const unaccessibleKey& k) const
   {
      return k.noncostmem;
   };
}

bool UnaccessibleEqualityFunction(const unaccessibleKey& p1, const unaccessibleKey& p2)
{???} //i dont know how to define this

std::unordered_map<aKey, std::unordered_map<unaccessibleKey, aValue, unaccessibleKeyHash, unaccessibleEqualityFunctions>, aKeyHash>

我这样做对吗(除了我不知道如何定义的功能)?附带说明一下,当我尝试调用 k.getnonconstmem()-&gt;nonconstfunction() 时出现错误。

可以使用 unaccessibleKey::nonconstmem 作为键本身,因为它实际上是一个散列 int,但这可能会导致以后出现我不想处理的复杂情况。

所以我的问题是:1. 我是否有正确的哈希语法,2. 我如何定义相等函数,3. 为什么我会在 const/nonconst 混合时得到错误?

【问题讨论】:

  • 什么是“不可访问”键?是私人领域吗?如果是这样,您可能会发现this 问题很有用。
  • 你的伪代码遗漏了太多重要的细节。请发minimal reproducible example

标签: c++ hash


【解决方案1】:
  1. 我的哈希语法是否正确

哈希结构本身具有正确的语法。哈希函数的定义是否正确,取决于目标类型的定义。特别是,如果 getnonconstmem() 是一个非常量函数,那么在 const 引用上调用它是不正确的。您只能在 const 对象上调用 const 函数。

  1. 如何定义相等函数

当对象具有相同的逻辑状态时返回 true,否则返回 false。假设状态由单个成员组成的示例:

return p1.member == p2.member;
  1. 为什么在 const/nonconst 混合时会出现错误?

显示的代码不足以解释为什么会出现错误。如果您尝试在 const 对象或通过指针或对 const 的引用的任何对象上修改或调用非 const 函数,则会出现错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多