2017-12-22 3 views
2

私のアプリケーションで最も優先度の高い「パケット」を取得したいと考えています。パケットは、nameという名前のstd :: stringとpriorityとしての整数の2つのフィールドのみを含む基本構造です。出力優先度キューでの構造体の比較

#include <iostream> 
#include <queue> 

using namespace std; 

typedef struct packet { 
    int priority; 
    std::string name; 

    friend bool operator<(const packet& a, const packet& b) { 
     return a.priority > b.priority; 
    } 

} 
packet; 

int main() { 
    std::priority_queue<packet*> packets; //I must use packet* as pointer (restriction). 

    packet* p1 = new packet(); 
    packet* p2 = new packet(); 
    packet* p3 = new packet(); 

    p1->priority = 200; 
    p2->priority = 20; 
    p3->priority = 89; 

    p1->name= "test"; 
    p2->name = "test2"; 
    p3->name = "test3"; 

    packets.push(p1); 
    packets.push(p2); 
    packets.push(p3); 

    std::cout << "first: " << packets.top()->name; 
    packets.pop(); 
    std::cout << "second: " << packets.top()->name; 
    packets.pop(); 
    std::cout << "third: " << packets.top()->name; 
    packets.pop(); 

    return 0; 
} 

最初:二TEST3:test2は第三:test1の

しかし、私は最初に最も優先度のパケットを取得したい、次のように私のコードです。この問題を解決するにはどうすればよいですか?ありがとう!あなたのstd::priority_queue

+1

あなたのプライオリティキュー – PYA

+0

[構造体のポインタのプライオリティキュー](// stackoverflow.com/a/13269561) –

答えて

4
#include <iostream> 
#include <queue> 

using namespace std; 

typedef struct packet { 
    int priority; 
    std::string name; 

    friend bool operator<(const packet& a, const packet& b) { 
     return a.priority > b.priority; 
    } 

} 
packet; 

struct comparator 
{ 
    bool operator()(const packet * a, const packet *b) 
    { 
     return a->priority > b->priority; 
    } 
}; 

//comparator f; edit - no need for this forgot to comment oops 

int main() { 
    std::priority_queue<packet*,vector<packet*>,comparator> packets; // i add comparator and vector<packet*> here 

    packet* p1 = new packet(); 
    packet* p2 = new packet(); 
    packet* p3 = new packet(); 

    p1->priority = 200; 
    p2->priority = 20; 
    p3->priority = 89; 

    p1->name= "test"; 
    p2->name = "test2"; 
    p3->name = "test3"; 

    packets.push(p1); 
    packets.push(p2); 
    packets.push(p3); 

    std::cout << "first: " << packets.top()->name; 
    packets.pop(); 
    std::cout << "second: " << packets.top()->name; 
    packets.pop(); 
    std::cout << "third: " << packets.top()->name; 
    packets.pop(); 

    return 0; 
} 

あなたは要素を比較し、それらに優先順位を付けcomparatorを提供する必要があります。

これが何をするか bool operator()(packet * a, packet *b)と私はこの struct comparatorを使用してください

は、それはあなたがコンパレータは2 packet*秒で()オブジェクト、その後true/falseを返します(最初の優先順位がある場合>や<秒のもの)を呼び出すことができますということです

コンテナタイプをstd::priority_queueに追加すると、デフォルトのコンテナ(ヒープが構築されている)になります。詳細: http://en.cppreference.com/w/cpp/container/priority_queue

+0

あなた 'comparator'が不必要にコードを複製し、取得されたため、' comparator'が必要それは間違っている( 'packet'構造体の中で比較が逆になるため)。また、両方のパラメータは 'const packet *'でなければなりません。 'bool operator()(constパケット* a、constパケット* b){return * a <* b; } ' – 1201ProgramAlarm

+0

私は' const'と注文の部分に同意します - 私は説明のためにコードを冗長にするとよいと思います。私は自分のコードが超簡潔だとは思わない - それは決して意図ではない。 – PYA

+0

いくつかのコメント 1. C++以降、 'typedef'は必要ありません。 2.不必要なグローバルな「コンパレータf」は必要ありません。 3. OPは降順でソートする必要があります。 'a-> priority> b-> priority' – balki