size_t operator()(const pair<int, int> p) const { // передавать pair<int, int> по ссылке или нет?
return (size_t)(h_i_1(p.first) * 37 * 37 + h_i_1(p.second) * 37 + 117);
}
hash<int> h_i_1;
hash<int> h_i_2;
};
То надо для каждого аргумента переопределять hash<int> :
hash<int> h_i_1;
hash<int> h_i_2;
или можно использовать нечто такое:
struct PairHash {
size_t operator()(const pair<int, int> p) const { // передавать pair<int, int> по ссылке или нет?
return (size_t)(h(p.first) * 37 * 37 + h(p.second) * 37 + 117);
}
hash<int> h;
};
и почему надо именно так?
Бессмысленно делать так, как в первом примере, так как h_i_1 и h_i_2 представляют собой объекты, реализующие хэш-функцию и к ним предъявлено требование: Результат hash<T>{}(t), где t имеет тип T должен зависеть только от значения t То есть, неважно, как ты напишешь: h(p.first), h_i_1(p.first), h_i_2(p.first) — везде результат будет одинаковый, и зачем тогда плодить лишние переменные.
И еще, кстати, прикольчик вдовесок. hash<int>, по крайней мере в libc++, определен следующим образом: struct hash<int> { size_t operator()(int __v) const { return static_cast<size_t>(__v); } } :)
Обсуждают сегодня