Как использовать unordered_set с функцией сравнения?
Я написал свою собственную функцию сравнения для третьего параметра шаблона std::unorderd_set. Моя функция
static bool HasSamePosition(const Node& a, const Node& b);
в классе Node. Теперь я пытаюсь использовать эту функцию в моем неупорядоченном наборе,
std::unordered_set<Node, std::hash<Node>, bool(*)(const Node& a, const Node& b)> closedlist(&Node::HasSamePosition);
но это не работает Ошибка состоит в том, что ни один экземпляр конструктора не соответствует списку аргументов. Что мне не хватает?
2 ответа
Решение
Ну, компилятор прав. Там нет конструктора, который позволяет вам только передать KeyEqual
в качестве параметра. Вам нужно использовать другой конструктор (см. Здесь) или изменить тип вашей функции.
Например, вы можете использовать вспомогательную структуру, которая обернет ваш вызов HasSamePosition и переопределит operator()(const Node& a, const Node& b)
struct Node{
static bool HasSamePosition(const Node& a, const Node& b);
};
struct NodeEqual
{
bool operator()(const Node& a, const Node& b) { return Node::HasSamePosition(a, b); }
};
int main()
{
std::unordered_set<Node, std::hash<Node>, NodeEqual> closedlist();
}
Проще использовать класс:
class Node
{
public:
class HasSamePosition
{
bool operator()(const Node& a, const Node& b)
{
// Put here content of your HasSamePosition function
}
};
....
};
std::unordered_set<Node, std::hash<Node>, Node::HasSamePosition> closedlist;