0

複雑な型で std::priority_queue を使用したい:

typedef struct
{
uint8_t data;
    uint64_t moredata;
}myData;

typedef struct
{
    boost::mutex someQueueLock;
    std::priority_queue<myData> myQueue; //does not work
}

ポインターが無効になる可能性があるため、ポインター (priority_queue) でいっぱいのキューを使用したくありません。

これは可能ですか?または、別の std コンテナーを使用する必要がありますか?

4

2 に答える 2

2

std::priority_queueoperator<デフォルトで要素をソートするために使用します。要素は厳密に弱い順序である必要があります

タイプoperator<の関数を定義する必要がありますmyData

bool operator<(const myData& lhs, const myData& rhs)
{
    return lhs.data < rhs.data;
}

§ 23.6.4.1 クラス テンプレート priority_queue

ランダム アクセス イテレータを持ち、操作 front()、push_back()、pop_back() をサポートする任意のシーケンス コンテナを使用して、priority_queue をインスタンス化できます。特に、vector (23.3.6) と deque (23.3.3) を使用できます。priority_queue のインスタンス化には、優先順位の比較を行うための関数または関数オブジェクトの提供も含まれます。ライブラリは、関数または関数オブジェクトが厳密な弱い順序付け(25.4) を定義していると想定しています。

§ 25.4

25.4 のすべての操作には 2 つのバージョンがあります。1 つは Compare 型の関数オブジェクトを受け取り、もう 1 つは operator< を使用します。

于 2013-07-28T07:54:27.217 に答える
1

priority_queue が優先度の高いアイテムを認識できるように、独自の比較関数を定義する必要があります。

bool MyCompare(const myData& left, const myData& right)
{
    // todo: return true if left has higher priority than right
}

std::priority_queue<myData, std::vector<myData>, MyCompare> queue;
于 2013-07-28T07:54:54.433 に答える