使用自定义比较器返回priority_queue

时间:2010-12-03 18:55:34

标签: c++ priority-queue standard-library

我有一个函数需要根据一些输入参数返回一个排序列表。我已选择std::priority_queue来保存此列表。

但是编译器给了我一个我不认识的错误。这是我的代码:

struct DepthCompare {
    bool operator()
        (const struct inst *&lhs, const struct inst *&rhs) const
    {
        return lhs->depth < rhs->depth;
    }
};

typedef priority_queue<struct inst*> HeuristicList;
HeuristicList getHeuristicList(struct BasicBlock &) {

    HeuristicList ret( DepthCompare );
    return ret;
}

编译器在return语句的行上说conversion from 'HeuristicList (*)(DepthCompare)' to non-scalar type 'HeuristicList' requested

看起来我不想回指针。出了什么问题?

2 个答案:

答案 0 :(得分:5)

你有两个问题。

要使用自定义比较器,必须将比较器类型指定为第三个模板参数:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;

HeuristicList ret( DepthCompare );被解释为函数声明,而不是变量声明,给出了您所看到的错误。您需要传递比较器的实例,并确保它不能被解释为函数声明:

HeuristicList ret = HeuristicList(DepthCompare());

但是,由于构造函数的第一个参数是可选的,并且默认为默认构造的比较器,因此您可以简单地编写

HeuristicList ret;

或者,因为你刚刚立即返回变量,

return HeuristicList();

答案 1 :(得分:0)

请注意,比较器是priority_queue的第三个模板参数。您必须声明priority_queue这样的内容:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;

这假设您要使用vector作为后备容器(默认)。

另请注意,在比较器仿函数中,您希望将参数声明为指针的const引用。你有一个指向const的指针。你想要这个:

bool operator()(inst* const& lhs, inst* const& rhs) const

您也不需要将比较器对象的实例传递给priority_queue构造函数,因为默认的比较器构造函数可以正常运行。