如何在知道哈希值并有一些谓词对象的情况下搜索std::unordered_set? (谓词通过pred(x) && pred(y)表示x == y来确定等效性。)

最佳答案

好吧,您可以忽略哈希值,并迭代整个unsorted_set以测试谓词。这不是理想的效率,因为您只希望迭代一个存储桶,但是它可以满足您的要求。

标准unordered_set具有用于获取特定存储桶(按数字)的迭代器的begin(size_t)接口(interface),以及用于获取存储桶数量的接口(interface)bucket_count()

保证具有给定哈希值的对象全部都出现在同一存储桶中,因此,对存储桶进行谓词测试足以满足您的需求。

我实际上在标准中看不到任何东西可以保证hash_value % bucket_count()来迭代正确的存储桶。有一个功能可以获取给定对象的存储桶,而不能获取给定哈希值的存储桶。不过,请在您的实现上尝试一下:我认为这是一个合理的猜测,我可能只是未能在标准中找到关键的限制。

总而言之,我认为您想要的是:

size_t bucket = hash_value % myset.bucket_count();
find_if(myset.begin(bucket), myset.end(bucket), pred);

但我不确定。

08-16 09:30