Вы можете обернуть свой большой объект в дополнительную структуру, в которой будет поле, которое будет использоваться пользовательской функцией сравнения, на этот элемент не должны влиять операции move , например, это должен быть некоторый простой тип данных как int
:
struct BigObject {
std::unique_ptr<int> data;
int forCmp;
};
struct Cmp {
bool operator()(const BigObject& lhs, const BigObject& rhs) {
return lhs.forCmp < rhs.forCmp;
}
};
после move(queue.top())
внутренний порядок очереди не может быть нарушен. Перемещенный экземпляр BigObject по-прежнему имеет действительное значение forCmp
, используемое компаратором.
Затем наследуйте от priority_queue
, выполнив это, вы получите доступ к контейнеру underyling c
и добавите front
метод:
template<class T, class Cmp>
struct Wrapper : std::priority_queue<T,std::vector<T>,Cmp> {
T& front() {
return this->c.front();
}
};
использование:
Wrapper<BigObject,Cmp> q;
BigObject bo;
bo.forCmp = 12;
q.push(std::move(bo));
BigObject i = std::move(q.front());
Полная демонстрация