如何将 Java 优先级队列转换为 C++ 优先级队列

how to convert java priority queue to c++ priority queue?

本文关键字:队列 优先级 C++ 转换 Java      更新时间:2023-10-16

我正在将Java代码重写为C++代码,并且在复制Java的优先级队列时遇到问题。

Java 优先级队列的比较函数如下所示:

  public int compareTo(Item that) {
    if (this.dist < that.dist)
      return -1;
    if (this.dist > that.dist)
      return 1;
    return 0;
  }

我在C++中做了一个比较函数,但它无法正常工作:

struct cmp
{
    bool operator()(Item it1, Item it2)
    {
        if(it1.dist > it2.dist)
            return true;
    }
};

这是我的C ++代码优先级队列

我这样称呼优先级队列

priority_queue<Item, vector<Item>, cmp> que;

但是,Java的顺序和C++的顺序是不同的。

请帮帮我

如果这还不够示例代码,我可以提供我的整个代码。Java 和 C++ code

将比较运算符定义为

struct cmp
{
    bool operator()(const Item & it1, const Item & it2)    // pass by a const reference
    {
        return it1.dist > it2.dist;
    }
};

您也可以将其定义为自由函数。

struct cmp
{
    bool operator()(Item it1, Item it2)
    {
        if(it1.dist > it2.dist)
            return true;
    }
};

理想情况下,if检查应反转:

if ( it1.dist < it2.dist)

由于priority_queue期望等同于std::less的东西.

此外,您可以简单地return

bool operator()(Item it1, Item it2)
{
    return  it1.dist < it2.dist;
}

重要的是,理想情况下,Item参数必须是const和附带引用的:

bool operator()(const Item& it1, const Item& it2)
{
    return  it1.dist < it2.dist;
}

如果您使用的是 C++11 或更高版本的编译器(我认为),您可以简单地使用 lambda 而不是定义operator() struct。看到这个答案

似乎

您没有在 cmp 中设置"返回 false"的条件C++

struct cmp
{
    bool operator()(Item it1, Item it2)
    {
        if(it1.dist > it2.dist)
            return true;
        else 
            return false
    }
};
您需要

修复返回的值:

struct cmp
{
    bool operator()(Item it1, Item it2)
    {
        return (it1.dist > it2.dist)
    }
};