2016-06-06 3 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++ 's порядок отличается ..

Помогите мне пожалуйста

Если этого не достаточно, пример кода, я могу предоставить весь свой код , Java и C++ код

+2

'bool operator() (Item it1, Item it2)' В C++ передайте ссылку const, а не по значению. Не используйте Java в качестве модели при написании кода на C++. 'bool operator() (const Item & it1, const Item & it2)' – PaulMcKenzie

+0

Версия C++ реализует [строгий слабый порядок] (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

Кажется, вы не установили условие для «возврата ложь» в C++ имп

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 или выше, компилятор (я полагаю), вы можете просто использовать лямбда вместо struct, определяя operator(). См. this answer

Смежные вопросы