std::priority_queueで自作の型を使う

方法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