无序映射相等功能 c++

4
也许这很简单,但我只想知道我们是否能够做到这一点: 假设我们有一个unordered_map(string, string),默认情况下它会检查两个字符串是否相等。 现在,假设我们在相等运算符中添加了一个功能,即使两个字符串是彼此的字谜,也返回true。为了实现这个目标,我们只需要更新相等运算符而不更改哈希器(并使用默认哈希器)吗? 例如,仅为...定义函数:
bool operator() (const string& a, const string& b) const  
{  
    // check for anagram condition here  
}

对每个字符串进行排序,然后进行哈希、比较等操作。 - Jerry Coffin
@Jerry:抱歉,我没听懂你的意思。 - JackSparrow
2个回答

6

相等的对象必须具有相同的哈希值,否则哈希表将在错误的桶中查找值。例如,字符串 ab 和 ba 可能会被放置在不同的桶中,因此当您查找 ab 时,即使它们应该是“相等”的,也无法找到 ba。

因此,不能使用默认的哈希函数。


2
您应该使用一些与排列不变的哈希函数,例如字符串中各个char的总和。 - Basile Starynkevitch

0

是的,您可以使用默认哈希函数和自定义相等运算符。使用哈希std::hash和equal作为您的自定义运算符。

template<
   class Key,
   class T,
   class Hash = std::hash<Key>,
   class KeyEqual = std::equal_to<Key>,
   class Allocator = std::allocator<std::pair<const Key, T>>
>     class unordered_map; 

6
但这可能不会达到 OP 所期望的效果。两个变形词将不被视为具有相等的键。 - juanchopanza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接