std::priority_queue:自定义排序而无需定义比较器类

4

我希望有一个具有自定义排序的优先队列,但是因为懒惰,我不想定义一个实现operator()的比较器类。

我真的很希望像这样编译:

std::priority_queue<int, std::vector<int>, 
    boost::bind(some_function, _1, _2, obj1, obj2)> queue;

其中some_function是一个返回布尔值的函数,它接受四个参数,第一个和第二个参数是队列中的整数,最后两个参数是用于计算排序的一些对象(const引用)。

(错误:'boost :: bind'不能出现在常量表达式中)

但这段代码无法编译。即使是更简单的

std::priority_queue<int, std::vector<int>, &compare> queue;

无法编译,因为compare是一个返回bool的二元函数。

(错误:在模板参数列表中的第3个参数处的类型/值不匹配,应该是一个类型,但实际上得到的是‘compare’)

有什么建议吗?


你在这里的 boost::bind 上没有闭合括号 - 在队列模板参数的 > 之前。这是发布的代码中的笔误还是你尝试编译时的笔误? - Steve Townsend
1个回答

11

这个方法可能可行:

std::priority_queue<int, std::vector<int>, 
    boost::function<bool(int,int)> >
然后将绑定表达式传递给队列的构造函数。
顺便说一句,你之所以会收到编译错误,是因为你正在将运行时计算的表达式放在需要类型名称或常量表达式的地方。

3
+1,这是一个不错的解决方案。但是需要注意的是,不幸的是,这并不完全等同于静态提供特定模板函数/函数对象参数,因为 boost::function 使用动态分配来创建可变函数对象。所以,你将无法获得像自定义静态提供函数参数那样的编译器生成的内联效率。 - Charles Salvia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接