2016-07-20 3 views
0

優先度の高いキューでオブジェクトを順序付ける方法に関する情報が見つかりませんでした。私はこの試みた:C++のpriority_queueでオブジェクトをどのように順序付けしますか?

class Person { 
    ... 
    public: 
    bool operator<(const Person& p) { 
     return age < p.age; 
    } 
} 

int main() { 
    priority_queue<Person*> people; 
    people.push(new Person("YoungMan", 21)); 
    people.push(new Person("Grandma", 83)); 
    people.push(new Person("TimeTraveler", -5000)); 
    people.push(new Person("Infant", 1)); 

    while (!people.empty()) { 
     cout << people.top()->name; 
     delete people.top(); 
     people.pop(); 
    } 

をそして、(高齢者がより高い優先順位を取得するため、最初のキューを残す)、年齢に基づいて優先権を与えることになっていますが、それは動作しません。しかし、私はこの出力を得ています:

Infant 
Grandma 
TimeTraveler 
YoungMan 

私はこれがどのような順序であるのか分かりませんが、確かに年齢ではありません。

+1

、それはポインタの値ではなく、年齢を使用して並べ替えます。 'priority_queue 'を使い、 'new'を押してください。 –

答えて

7

priority_queue<Person*>実際には、比較器std::less<Person*>を使用してPersonオブジェクトのメモリアドレスを比較しています。

あなたが提供したoperator<に基づいて注文する代わりに、priority_queue<Person>と宣言してください。

それとも、(何らかの理由で)ポインタを使用して主張すれば、その後のように宣言します。これは前者がはるかに一般的に現代的なCの++で使用されているスマートポインタではない生のポインタを、使用していることを

auto age_comp = [](const std::unique_ptr<Person>& lhs, const std::unique_ptr<Person>& rhs) -> bool { 
    return *lhs < *rhs; 
}; 
std::priority_queue<std::unique_ptr<Person>, std::vector<std::unique_ptr<Person>>, 
    decltype(age_comp)> people(age_comp); 
// note: must pass age_comp to std::priority_queue constructor here as 
// lambda closure types have deleted default constructors 

注 - ドン非常に良い理由がない限り、生のポインタを使用しません。 std::priority_queueのコンパレータはconstを期待してoperator<const仕様を持っていない場合は可能性の高いエラーをスローします - それはどの時点でそれはに属しPersonオブジェクトを変更するべきではない。また、Personoperator<constを指定する必要があり

。だから、にoperator<を変更する:あなたは、ポインタの `priority_queue`を持って

bool operator<(const Person& p) const { 
    return age < p.age; 
} 
+0

これは、ありがとうございます。また、オペレータのオーバーロード関数の後に(本体部分の前に)constを追加する必要があるという意味のエラーが出ました。なぜここにconstが必要ですか? –

+0

ああ、 '演算子<'は 'this'を変更してはならないので' const'仕様を持たなければならない - 'std :: priority_queue'のコンパレータは' const'を指定しているので、ここで必要な(そして正しい) 。 – ArchbishopOfBanterbury

関連する問題