1. ホーム
  2. c++

[解決済み] 優先キューSTLをオブジェクトに使うには?

2023-06-17 15:23:02

質問

class Person
{
public:
    int age;
};

Personクラスのオブジェクトを優先キューに格納したい。

priority_queue< Person, vector<Person>, ??? >

比較の件ではクラスを定義する必要があると思うのですが、よくわかりません。

また、書くときに

priority_queue< int, vector<int>, greater<int> > 

大はどのように機能するのか?

どのように解決するのですか?

キューに格納された型に対して、有効な厳密な弱い順序の比較を提供する必要があります。 Person を提供する必要があります。デフォルトでは std::less<T> と等価なものに解決されます。 operator< . これは、それ自身のストアド型が1つであることに依存しています。ですから、もしあなたが

bool operator<(const Person& lhs, const Person& rhs); 

であれば、これ以上変更することなく動作するはずです。実装は

bool operator<(const Person& lhs, const Person& rhs)
{
  return lhs.age < rhs.age;
}

もし、型が自然な "less than" 比較を持たない場合、デフォルトの std::less<Person> . 例えば

struct LessThanByAge
{
  bool operator()(const Person& lhs, const Person& rhs) const
  {
    return lhs.age < rhs.age;
  }
};

のように、キューをインスタンス化します。

std::priority_queue<Person, std::vector<Person>, LessThanByAge> pq;

の使用について std::greater<Person> をコンパレータとして使う場合、これには operator> と等価であり、デフォルトの場合とは優先順位が逆転したキューを作成する効果があります。そのためには operator> を操作することができる Person インスタンスを操作することができます。