2013-09-08 5 views
3

Может быть, это легко, но я просто хочу понять, если мы можем это сделать:Unordered Map функциональность равенство с ++

Пусть говорят, у нас есть unordered_map(string, string) поэтому по умолчанию он будет проверять на равенство, если две строки равны.

Теперь скажем, добавим ли еще одну функциональность в оператор равенства, что, даже если две строки являются анаграммами друг друга, тогда также возвращаем true. Для этого можно только обновить оператор равенства, а не хешер (и использовать хешер по умолчанию).

Например, только определяя функтор для:

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

Сортировка каждой строки, затем хэш, сравнение и т. Д. –

+0

@ Джерри: Извините, но не получите вас. – JackSparrow

ответ

6

Равные объекты должны иметь одинаковый хэш, иначе хеш-таблица будет искать значения в неправильном ковше. Например, строки ab и ba, вероятно, попадают в разные ведра, поэтому, когда вы смотрите ab, вы не можете найти ba, даже если они должны быть «равными».

Нет, вы не можете использовать хэш-функцию по умолчанию.

+2

Вы должны использовать некоторую хеш-функцию, инвариантную с перестановками, например, сумма отдельных 'char'-s строк. –

+0

@Joni: Спасибо за ваш ответ, и ваш пример действительно имеет смысл. – JackSparrow

-1

Да, вы можете использовать функцию хэш-умолчанию и ваш оператор, равный пользовательский. Используйте 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; 
+6

Но это, вероятно, не повлияет на результат OP. Две анаграммы не будут рассматриваться как имеющие одинаковые ключи. – juanchopanza