当前位置: 首页 > 知识库问答 >
问题:

C实现具有不同优先级函数的优先级队列的最佳方法是什么?

能远
2023-03-14

我看到的替换优先级队列比较器的公认答案是在新的比较类中重载操作符。

class Foo
{

};

class Compare
{
public:
    bool operator() (Foo, Foo)
    {
        return true;
    }
};

int main()
{
    std::priority_queue<Foo, std::vector<Foo>, Compare> pq;
    return 0;
}

然而,我想为队列实现几个(10)不同的比较函数,并在运行时在main()中创建pq时选择一个。我必须做10个不同的比较类还是有更简单的方法来做到这一点?

共有2个答案

司空炯
2023-03-14

将函数用作比较器模板参数,将函数实例传递给队列的构造函数,请参见此处的第二个构造函数。

对于类型,可以使用C函数objectstd::function

壤驷华辉
2023-03-14

我必须做10个不同的比较类,还是有更简单的方法?

你不必这么做。优先级队列要求比较器采用Foo并返回bool——默认值为std::less

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

在您的情况下,您可以使用lambda或指针来实现这一目的。例如,

using cmp1 = bool(*)(const Foo&, const Foo&);
bool FooCmp1(const Foo& f1, const Foo& f2)
{
     // do real comparison..
     return true;
}

priority_queue<Foo, std::vector<Foo>, cmp1> pq(FooCmp1);
 类似资料:
  • 我想实现一个具有以下约束的双端优先级队列: > 需要在固定大小的数组中实现。例如100个元素。如果在数组已满后需要添加新元素,则需要删除最旧的元素 需要最大和最小的O(1) 如有可能,插入O(1) 如果可能,去掉O(1)中的最小值 如果可能,清除O(1)中的空/初始化状态 O(1)中当前数组中元素的个数 我希望 O(1) 用于上述所有 5 个操作,但不可能在同一实现中对所有这些操作使用 O(1)。

  • 我定义最大优先级队列如下: 我需要理解这是如何工作的,特别是当1只得到2的索引(而不是4)时? 多谢了。

  • 我正在编写一个涉及堆实现的代码,在我的bubbleUp方法中,在我的while循环行中,我似乎遇到了一个取消引用的错误。这可能是一个相当基本的问题,但解决这个问题的最佳方法是什么?我在实现removeHigh方法时也遇到了一些问题,该方法旨在从队列中移除最高的元素。

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我目前正在尝试实现min heap PQ,但是我在实现的正确性方面遇到了一些问题,我似乎无法找出我做错了什么——它没有输出最低优先级,也没有对它们进行正确排序。 使用以下测试数据: 我得到以下结果: 我希望结果是按升序排列的——起初我认为这可能是因为交换了错误的孩子,但最后一个输出是最大的优先级,所以这没有意义。我花了几个小时试图研究堆优先级队列,但我找不到任何帮助。 以下是CMP要求的更好的代码

  • 我正在尝试实现一个优先级队列,它的功能与普通的优先级队列有点不同。这里的想法是支持快速插入,但对最高优先级项目的访问较慢。在这种情况下,Insert方法将新项放在任何方便的地方;因此,remove和peek方法必须在整个队列中搜索最高优先级的项。 ////测试文件 我已经能够实现除remove和peek之外的所有方法,因为我无法获得实现这些方法的正确逻辑。我不知道如何搜索整个队列来找到最高优先级的