4

可能这很容易,但我只想了解我们是否可以这样做:

假设我们有一个unordered_map(string, string)so 默认情况下,如果两个字符串相等,它将检查是否相等。

现在,假设我们在等式运算符中再添加一项功能,即使两个字符串是彼此的字谜,那么也返回 true。为此,我们可以只更新相等运算符而不更新哈希器(并使用默认哈希器)。

例如,只为以下定义函子:

bool operator() (const string& a, const string& b) const  
{  
    // check for anagram condition here  
}
4

2 回答 2

6

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

所以不,你不能使用默认的哈希函数。

于 2013-09-08T07:54:30.433 回答
-1

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

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; 
于 2013-09-08T07:51:47.063 回答