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

Я пытаюсь определить тип 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 не являются допустимыми шаблонными аргументами типа. Документация сбивает с толку, потому что она не говорит точно, что вводит аргументы шаблона, как, предполагается, - я, как просто предполагается, даю ей функцию, как я сделал здесь или являюсь там некоторым другим видом объекта, который инкапсулирует функцию (потому что документация действительно говорит о "типе объекта хеш-функции")?

10
задан Alex319 20 January 2010 в 06:56
поделиться

2 ответа

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

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;
};

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

Конечная const - это просто потому, что оператор на самом деле не изменяет состояние класса, в основном потому, что его нет. Просто приятно сказать об этом явно.

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

9
ответ дан 3 December 2019 в 23:12
поделиться

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

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*/; }
};
5
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: