2016-06-06 233 views
0

我重写Java代码为C++代码时遇到复制Java的优先级队列的问题..如何将java优先级队列转换为C++优先级队列?

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++代码

+2

'bool操作符()(Item it1,Item it2)'在C++中,传递const引用,而不是通过值。不要将Java用作编写C++代码的模型。 'bool operator()(const Item&it1,const Item&it2)' – PaulMcKenzie

+0

C++版本实现[strict weak ordering](http://en.wikipedia.com/wiki/Strict_weak_ordering),所以它基本上不能处理同等优先级的值。 Java版本可以处理相同的优先级,但会以任意顺序(不是FIFO或LIFO)返回相同优先级的值,所以通常最好不要具有同等优先级的值。如果你没有相同优先级的值,那么是的,你可以转换。 – Andreas

+0

@Andreas:'std :: priority_queue'处理相等的值就好了。 –

回答

1

定义你的比较操作员

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

您也可以将其定义为一个免费的功能。

+0

我修复它们,但它有无限循环哈哈..它似乎不是优先问题谢谢~~ –

+0

@ParkYeoungJun也许你可以发布它作为另一个问题。 – Shreevardhan

0

看来你没有设置 '返回false' 的情况在C++ CMP

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

你需要修复您的返回值:

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

    } 
}; 
1
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代替struct定义operator()。请参阅this answer