Определение пользовательской хеш-функции и функции равенства для unordered_map - PullRequest
10 голосов
/ 20 января 2010

Я пытаюсь определить тип unordered_map, который имеет пользовательскую хеш-функцию и функцию сравнения равенства.Прототипы функций этих функций следующие:

//set<Vertex3DXT*> is the type of the key; Cell3DXT* is the type of the value
size_t VertexSetHashFunction(set<Vertex3DXT*> vertexSet); //hash function
bool SetEqual(set<Vertex3DXT*> a, set<Vertex3DXT*> b); //equality

У меня объявлены эти прототипы функций, а затем я пытаюсь объявить тип следующим образом:

typedef std::tr1::unordered_map<set<Vertex3DXT*>, Cell3DXT*, VertexSetHashFunction, SetEqual> CellDatabaseMapType;

Но он говорит, чтоVertexSetHashFunction и SetEqual не являются допустимыми аргументами типа шаблона.Документация сбивает с толку, потому что она не говорит точно, какого типа должны быть аргументы шаблона - я просто должен дать ей функцию, как здесь, или есть какой-то другой тип объекта, который инкапсулирует функцию (потому чтодокументация говорит о "типе объекта хэш-функции")?

Ответы [ 2 ]

9 голосов
/ 20 января 2010

К сожалению, эти функции должны быть объявлены как оператор () в классе. Как это:

class VertexSetHashFunction {
  public:
    ::std::size_t operator ()(const ::std::set<Vertex3DXT*> &vertexSet) const;
};
class SetEqual {
  public:
    bool operator ()(const ::std::set<Vertex3DXT*> &a, const ::std::set<Vertex3DXT*> &b) const;
};

Вам не нужно изменять аргументы, чтобы они были константными ссылками, но я настоятельно рекомендую это сделать. Создание копии :: std :: set является относительно дорогим, и вы не должны делать это, если вам абсолютно не нужно.

Конечный констант только потому, что оператор вообще не изменяет состояние класса, в основном потому, что его нет. Просто приятно так сказать.

В качестве альтернативы, вы можете определить свою собственную специализацию шаблона :: std :: hash. На самом деле я бы порекомендовал это, если есть один стандартный способ, которым вы хотите, чтобы этот конкретный набор хэшировался, потому что этот шаблон используется по умолчанию, если вы не предоставляете хеш-функцию для unordered_map или unordered_set и что-либо еще, что требует хеш-функции. 1010 *

5 голосов
/ 20 января 2010

Вам нужны функторы.

struct VertexSetHashFunction {
    size_t operator() (const set<Vertex3DXT*>& vertexSet) const { return /*whatever*/; }
};

struct SetEqual {
    bool operator() (const set<Vertex3DXT*>& a, const set<Vertex3DXT*>& b) const { return /*whatever*/; }
};
...