C++98中std::priority_queue自定义比较器编译错误问题
在C++98中使用std::priority_queue的类型错误问题
你在C++98中尝试创建std::priority_queue变量的代码如下:
struct { bool operator()(std::vector<int> v1, std::vector<int> v2){return (v1[2] + v1[3]) > (v2[2] + v2[3]);}; } queueCompare; std::priority_queue< std::vector<int>, std::vector< std::vector<int> >, queueCompare > queue;
编译器报错:
expected a type, got `queueCompare'
错误原因
std::priority_queue的第三个模板参数要求传入类型,但你写的queueCompare是一个结构体的实例对象,不是类型。而且你定义的是匿名结构体,本身没有可直接引用的类型名称,所以编译器无法识别它作为模板参数。
解决方法
方法一:给结构体命名(推荐)
给匿名结构体加上名称,用类型名作为模板参数,再在构造队列时传入该类型的实例:
struct QueueCompare { bool operator()(std::vector<int> v1, std::vector<int> v2) { return (v1[2] + v1[3]) > (v2[2] + v2[3]); } }; // 第三个参数传入类型QueueCompare,构造时传入该类型的实例 std::priority_queue<std::vector<int>, std::vector<std::vector<int>>, QueueCompare> queue(QueueCompare());
方法二:使用函数指针(不推荐)
如果不想定义具名结构体,可以把比较逻辑改成普通函数,用函数指针类型作为模板参数:
bool queueCompare(std::vector<int> v1, std::vector<int> v2) { return (v1[2] + v1[3]) > (v2[2] + v2[3]); } // 第三个参数是函数指针类型,构造时传入函数地址 std::priority_queue<std::vector<int>, std::vector<std::vector<int>>, bool(*)(std::vector<int>, std::vector<int>)> queue(&queueCompare);
方法一的仿函数实现性能更优,编译器能更好地做内联优化,是C++中自定义优先级队列比较规则的常规做法。
内容的提问来源于stack exchange,提问作者zeregzesis
相关产品推荐
相关产品推荐

