如何将unordered_set与比较功能一起使用

How to use unordered_set with compare function?

本文关键字:功能 比较 一起 set unordered      更新时间:2023-10-16

我为 std::unorderd_set 的第三个模板参数编写了自己的比较函数。我的函数是

static bool HasSamePosition(const Node& a, const Node& b);

在类节点中。现在我正在尝试在我的无序集合中使用这个函数,

std::unordered_set<Node, std::hash<Node>, bool(*)(const Node& a, const Node& b)> closedlist(&Node::HasSamePosition);

但它不起作用。错误在于,构造函数的实例与参数列表不匹配。我错过了什么?

编译器是对的。没有构造函数允许您仅将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;