2016-10-06 2 views
0

Я использую priority_queue для решения проблемы. Я намерен объявить свой узел следующим образом.Почему я не могу поставить компаратор внутри узла?

struct node{ 
     int x, y, val; 
     node(int _x, int _y, int _val){ 
      x = _x; 
      y = _y; 
      val = _val; 
     } 
     bool operator < (const node& rhs) const{ 
      return val > rhs.val; 
     } 
    }; 

и использовать его следующим образом:

priority_queue<node, vector<node>, node> queue; 

Но это не работает.

Затем я переключаюсь на другой способ. Оно работает.

struct node{ 
     int x, y, val; 
     node(int _x, int _y, int _val){ 
      x = _x; 
      y = _y; 
      val = _val; 
     } 

    }; 
struct com{ 
    bool operator() (const node& lhs, const node& rhs) const{ 
      return lhs.val > rhs.val; 
     } 
}; 
priority_queue<node, vector<node>, com> queue; 

Я не знаю, почему есть разница. Будем признательны любому совету.

Учитывая следующий ответ, я пробовал разные способы, чтобы запустить свой код, они работают:

Version 1

struct node{ 
     int x, y, val; 
     node(int _x, int _y, int _val){ 
      x = _x; 
      y = _y; 
      val = _val; 
     } 
     node(){} 

     bool operator() (const node& lhs, const node& rhs) const{ 
     return lhs.val > rhs.val; 
    } 
}; 

priority_queue<node, vector<node>, node> queue; 

Версия 2:

struct node{ 
     int x, y, val; 
     node(int _x, int _y, int _val){ 
      x = _x; 
      y = _y; 
      val = _val; 
     } 
    bool operator < (const node& rhs) const{ 
     return val > rhs.val; 
    } 

}; 
priority_queue<node, vector<node>, less<node>> queue; 
//or 
//priority_queue<node, vector<node>> queue; 
//or 
//priority_queue<node> queue; 
+0

Потому что в вашем узле, не 'оператор()', который определен. Вы можете просто использовать 'std :: less ', чтобы заставить его работать, или просто опустить разделитель. – StoryTeller

+3

Разве вы не заметили разницы между оператором сравнения в структуре 'node' и оператором вызова функции в структуре' com'? Как один из операторов *** сравнения ***, а другой оператор *** функции ***? –

+1

Не требуется дополнительный аргумент шаблона в первом примере, потому что тогда будет использоваться стандартный 'std :: less', который использует оператор' <'. Таким образом, в первом примере все, что вам нужно, это 'priority_queue queue;' –

ответ

5

node не по умолчанию и не имеет operator()

Поскольку y ou're используя operator<, вам не нужно указывать компаратор, потому что по умолчанию std::less<T>, который использует его, если он доступен. И если вам не нужно указывать компаратор, нет причин указывать контейнер, поскольку std::vector<T> уже по умолчанию.

priority_queue<node, vector<node>, less<node>> queue; 
// same as 
priority_queue<node, vector<node>> queue; 
// also same as 
priority_queue<node> queue; 
0

priority_queue буквально называет com(arg1, arg2) во время его оценки.

Эта функция должна быть доступна как объект-функция (как это в вашем примере работает), статическая функция или лямбда. У вашего первого struct нет ни одного из них.

1

В первом случае node является не компаратора как таковой — вместо этого, он обеспечивает перегрузку для operator<, так что вы должны использовать это:

priority_queue<node, vector<node>> queue; 

без какого-либо третьего аргумента. Это должно сработать.

Обратите внимание, что компаратор является тот, который может быть вызван как:

cmp(x,y) 

Так что в этом смысле, ваш класс node не поддерживает, что — она, тем не менее, поддерживает это:

x < y 

что-то другое, и как таковое можно использовать с компаратором по умолчанию std::less<T>, используемым std::priority_queue.

0

Поскольку аргумент 3-го шаблона принимает только формат compareFunction (objA, objB).По умолчанию это class Compare = std::less<typename Container::value_type>, который std :: less вызывает оператор <().

Следующий код должен работает

std::priority_queue<node, std::vector<node>> queue; 

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

  • Нет связанных вопросов^_^