【问题标题】:Searching std::unordered_set by hash value and predicate通过哈希值和谓词搜索 std::unordered_set
【发布时间】:2010-10-13 12:02:11
【问题描述】:

我如何搜索一个 std::unordered_set 知道哈希值并有一些谓词对象? (由pred(x) && pred(y)确定等价的谓词意思是x == y。)

【问题讨论】:

  • pred(x) && pred(y) 等价于 x == y。这意味着最多存在一个 pred(x) 持有的不同对象 :) 也许你有错字?
  • 不,这意味着最多存在一个给定类型的对象,并且谓词对它是正确的:)。伙计们,我们找到了单例的数学方程:D
  • 这不是意味着只要 2 个对象满足谓词,它们就相等(由运算符 == 定义)?在 C++ 中阅读 == 而不是在数学中阅读(尽管 == 是等效关系顺便说一句)。
  • @Armen Tsirunyan:首先 - 这是基本原则,尽管它不是必需的(参见 std::string - 可以有 2 个相等的对象 [如 ==] 但占用内存中有2个不同的空间)。第二 - 不,它没有。
  • @Armen:考虑struct MyPred { string s; bool MyPred(string s) : s(s) {} bool operator()(string t) { return s == t; }}; MyPred pred(y);。那么pred 是一个谓词(检查),其属性pred(x) && pred(y) 等价于x == y(检查)。就形式逻辑而言,没有人说ypred 中不是免费的:-)

标签: c++ boost c++11 unordered-set


【解决方案1】:

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

标准unordered_set 有一个接口begin(size_t) 用于获取特定桶的迭代器(按编号),还有一个接口bucket_count() 用于获取桶的数量。

保证具有给定哈希的对象都出现在同一个存储桶中,因此迭代该存储桶测试谓词就足够了。

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

总之,我认为你想要这样的东西:

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

但我不确定。

【讨论】:

  • 我想过,但我都没有找到保证桶是hash_value % myset.bucket_count();
  • 耻辱。也许您需要使用来自 hash_value -> object 的 multimap,而不是 unordered_set。我想知道是否有接近 TR1 和/或 C++0x 设计过程的人写过这篇文章。
  • 我使用了unordered_map,但我认为它并不好,因为基本上它是一组我查找而不是映射的对象(没有提到两次使用哈希对象)。
猜你喜欢
  • 2020-08-27
  • 2011-01-15
  • 1970-01-01
  • 2012-09-01
  • 2020-03-26
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
相关资源
最近更新 更多