如何使用priority_queue的比较对象初始化具有priority_queue作为值的映射?

时间:2011-02-14 11:19:57

标签: c++ stl map priority-queue

我想要做的是有一个映射,它将整数键映射到指向我已定义的结构的指针的priority_queues,该结构由我也定义的比较函数排序。

也就是说,类型会是这样的,

map<int, priority_queue<object_t*, compare> > my_map;

你可以假设object_t是我定义的struct,而compare是一个返回布尔值的比较函数。

有没有办法可以声明my_map让priority_queues已经用比较函数初始化了?例如,我可以声明它以便我可以执行以下操作,

my_map[1].push(object_ptr);
my_map[1].push(object_ptr1);

并相信两个对象指针已在priority_queue中正确排序?

由于

1 个答案:

答案 0 :(得分:0)

什么是“比较”?如果它是一个函数指针,在提供值之前必须非常小心不要使用它,因为默认构造的priority_queue将使用空指针。确保非空指针的最简单方法 - 如果你不能如下所示重写或换行 - 具有讽刺意味的是,永远不要使用索引运算符;而是使用find和insert方法。

如果“compare”是一个仿函数,那么它应该被编写,因此它的默认构造完全符合所需要的(通常没有) - 这种情况很难实现。

一旦priority_queue中的比较器具有适当的值(例如,指针盒中没有空指针),那么您可以确保您的对象将被正确排序。


如果你有一个固定的函数并且正在使用函数指针:

bool my_compare(object_t *a, object_t *b) {
  // do something
}
typedef bool (*compare)(object_t*, object_t*);

重写为:

struct compare {
  bool operator()(object_t *a, object_t *b) {
    // do something
  }
};

如果您不能将该函数重写为比较器(例如,它来自某些第三方库),您可以将(固定)函数指针包装在比较器中:

bool my_compare(object_t*, object_t*);
struct compare {
  bool operator()(object_t *a, object_t *b) {
    return my_compare(a, b);
  }
};