Просто своп аргументы, данные вашему Comparator
объекту:
auto cmp = [](auto a, auto b) { return Comparator()(b, a); };
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq(cmp);
Обратите внимание, что ваши Comparator
(то есть Compare
вstd::priority_queue
) должен обеспечивать строгий слабый порядок .
A Compare
тип, обеспечивающий строгий слабый порядок.
Однако,лямбда-выражение
auto cmp = [](auto a, auto b) { return !Comparator()(a, b); };
может не обеспечивать строгое слабое упорядочение.Например, если Comparator()(a, b)
определено как a < b
, то !Comparator()(a, b)
будет эквивалентно !(a < b)
, что, в свою очередь, эквивалентно a >= b
и определенно отличается от a > b
.
В отличие от оператора >
, оператор >=
представляет собой бинарное отношение 1 , которое не обеспечивает строгого слабого порядка , поскольку строгость 2 не имеет места, поскольку верно, что a >= a
, то есть фактически оно рефлексивно 3 .
(1) двоичное отношение - это просто двоичный предикат , т. Е. Булева функция, принимающая два параметра, например, реляционные операторы или operator()
функция-член std::less<int>
.
(2) Бинарное отношение, которое называется строгим , если оно никогда не содержит для элемента и самого себя, например, <
, поскольку a < a
никогда не выполняется.
(3) Бинарное отношение, которое называется возвратным , если оно всегда выполняется для элемента исам, например, <=
, поскольку a <= a
всегда выполняется.