2016-06-06 271 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