方法1 operator<()を実装する
以下の例のように、MyClass::operator<()を実装すればOK。
#include <iostream> #include <queue> class MyClass { public: MyClass(int num) : num_(num) {} std::string toString() const { return std::to_string(num_); } bool operator<(const MyClass& rhs) const { return num_ > rhs.num_; } private: int num_; }; int main() { std::priority_queue<MyClass> que; que.push(MyClass(3)); que.push(MyClass(1)); que.push(MyClass(2)); std::cout << que.top().toString() << std::endl; que.pop(); std::cout << que.top().toString() << std::endl; que.pop(); std::cout << que.top().toString() << std::endl; que.pop(); return 0; }
方法2 比較用の型を追加する
自作の型を比較する型(以下の例だと、MyClass::Compare)を追加して、それをstd::priority_queueに渡せばOK。
#include <iostream> #include <queue> class MyClass { public: MyClass(int num) : num_(num) {} std::string toString() const { return std::to_string(num_); } struct Compare { bool operator()(const MyClass& a, const MyClass& b) const { return a.num_ > b.num_; } }; private: int num_; }; int main() { std::priority_queue<MyClass, std::vector<MyClass>, MyClass::Compare> que; que.push(MyClass(3)); que.push(MyClass(1)); que.push(MyClass(2)); std::cout << que.top().toString() << std::endl; que.pop(); std::cout << que.top().toString() << std::endl; que.pop(); std::cout << que.top().toString() << std::endl; que.pop(); return 0; }
実行結果
1 2 3
参考
https://cpprefjp.github.io/reference/queue/priority_queue.html