【问题标题】:Hash function result and bucket number in unordered_setunordered_set 中的哈希函数结果和桶号
【发布时间】:2020-10-07 11:55:05
【问题描述】:

假设我有一个std::unordered_set<T> mySet 用我自己的哈希函数hashFunc(T item) 初始化。我想做的是首先将一些项目插入mySet,然后有一个函数search(T item)接受一个项目,找到如果要插入它会去哪个桶b(但没有插入它),最后返回桶b上的所有其他项目。我可以这样计算b吗?

b = hashFunc(item)

是否保证b 会成为我正在寻找的存储桶?如果没有,我有什么选择?

【问题讨论】:

  • 不,散列函数计算散列而不是存储桶。为什么你需要找出一个元素可能在哪个桶中?您需要解决的实际和潜在问题是什么?为什么你认为拿到水桶可以帮助你解决问题? normal bucket interface 不适合你吗?

标签: c++ std unordered-set


【解决方案1】:

unordered_set 上的 bucket 方法接受一个键并返回具有该键的元素将进入的存储桶索引。例如:

#include <iostream>
#include <string>
#include <unordered_set>

int main() {
  std::unordered_set<std::string> x = {"foo", "bar", "baz"};

  std::cout << "foo: " << x.bucket("foo") << "\n";
  std::cout << "fox: " << x.bucket("fox") << "\n";
  std::cout << "bat: " << x.bucket("bat") << "\n";
}

在我的实现中,打印

foo: 2
fox: 0
bat: 1

获得存储桶索引后,您将通过调用采用存储桶索引的beginend 重载来迭代该存储桶中的项目。

您不需要直接调用您的哈希函数。

【讨论】:

  • 参考说Returns the bucket number where the element with value k is located. 你的回答说它也像would be located 说的那样。你确定吗?
  • 根据标准,它返回“桶的索引,如果存在任何这样的元素,将在其中找到键等于 k ​​的元素”([unord.req.general])。不需要已经在集合中。
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多