【问题标题】:std::priority_queue: Custom ordering without defining comparator classstd::priority_queue:不定义比较器类的自定义排序
【发布时间】:2011-05-10 08:32:08
【问题描述】:

我想要一个具有自定义排序的优先级队列,但是我很懒,我不想定义一个比较器类来实现 operator()。

我真的很想编译这样的东西:

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

其中 some_function 是一个布尔返回函数,带有四个参数,第一个和第二个是队列的整数,最后两个是计算排序所需的一些对象(常量引用)。

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

但这不能编译。更简单的

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

不会编译,因为 compare 是一个返回 bool 的二进制函数。

(错误:“模板类 std::priority_queue”的模板参数列表中参数 3 的类型/值不匹配;预期类型,得到“比较”)

有什么建议吗?

【问题讨论】:

  • 这里的boost::bind 没有关闭括号 - 在队列模板参数的 > 之前。这是发布的代码中的拼写错误还是您尝试编译的内容?

标签: c++ boost stl bind priority-queue


【解决方案1】:

这可以工作:

std::priority_queue<int, std::vector<int>, 
    boost::function<bool(int,int)> >

然后将绑定表达式传递给队列的构造函数。

附:您会收到这些编译错误,因为您将运行时评估的表达式放在需要类型名或常量表达式的位置。

【讨论】:

  • +1,这是一个很好的解决方案。我只想指出,不幸的是,这与静态提供特定模板函数/函子参数并不完全相同,因为boost::function 使用动态分配来创建可变函数对象。因此,您不会获得与使用自定义、静态提供的函数参数相同的编译器生成的内联效率。
猜你喜欢
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多