用自定义比较器返回priority_queue
问题描述:
我有一个函数需要根据一些输入参数返回一个排序列表。我已选择一个std::priority_queue
来保存此列表。用自定义比较器返回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
。
它看起来不像我试图返回一个指针。出了什么问题?
答
你有两个问题。
要使用自定义比较,你必须指定比较类型作为第三个模板参数:
typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;
HeuristicList ret(DepthCompare);
被解释为函数声明,而不是一个变量声明,给你是错误看到。你需要通过比较器的一个实例,并确保它不能被解释为函数声明:
HeuristicList ret = HeuristicList(DepthCompare());
然而,由于constuctor的第一个参数是可选的,默认为缺省构造比较,你可以简单地写
HeuristicList ret;
或者,因为你只是返回变量直线距离,
return HeuristicList();
答
请注意,比较器是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
构造,作为默认的构造比较会做就好了。
谢谢。为了理解这一切,我有更多的阅读需要做。来自Java,我几次绕过匿名对象,并认为C++将是相同的方式。当然,为了清楚起见,我省略了`getHeuristicList()`的主体,所以我不会立即返回它。 我也需要手册来解释gcc的错误信息! – Mike 2010-12-04 17:45:57