Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无序映射相等功能c++;_C++_Unordered Map - Fatal编程技术网

C++ 无序映射相等功能c++;

C++ 无序映射相等功能c++;,c++,unordered-map,C++,Unordered Map,也许这很容易,但我只是想了解我们是否能够做到: 假设我们有一个无序映射(string,string),因此默认情况下,如果两个字符串相等,它将检查是否相等 现在,假设我们在equality操作符中再添加一个函数,即使两个字符串是彼此的anagram,也会返回true。为了做到这一点,我们只能更新相等运算符而不能更新哈希器(并使用默认哈希器) 例如,仅为以下对象定义函子: bool operator() (const string& a, const string& b) cons

也许这很容易,但我只是想了解我们是否能够做到:

假设我们有一个
无序映射(string,string)
,因此默认情况下,如果两个字符串相等,它将检查是否相等

现在,假设我们在equality操作符中再添加一个函数,即使两个字符串是彼此的anagram,也会返回true。为了做到这一点,我们只能更新相等运算符而不能更新哈希器(并使用默认哈希器)

例如,仅为以下对象定义函子:

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

是的,您可以使用默认哈希函数和自定义相等运算符。使用hash 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; 
模板<
类密钥,
T类,
类Hash=std::Hash,
类KeyEqual=std::等于,
类分配器=std::分配器
>类无序图;

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


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

对每个字符串进行排序,然后进行哈希、比较等@Jerry:对不起,我不明白你的意思。但这可能不会产生OP之后的效果。两个字谜不会被视为具有相等的键。您应该使用一些具有置换不变性的哈希函数,例如字符串的单个
char
-s之和。@Joni:谢谢您的回答,您的示例非常有意义。