2016-11-11 10 views
1

ブーストC++でペアリング優先度キューを扱う際に問題があります。私はアイテム配列{0,1,2,3、...}を持ち、各アイテムは優先順位値を持っています。これらの優先度キューは、別の配列{item0のkey0、item1のkey1、...}を構成します。ブーストC++の優先度キューの要素を操作する方法

アルゴリズムでは、優先度キューに入れるためにいくつかの項目を選択する必要があります。例えば、アイテム1,2,3を優先度の値(キー)で順序付けしてキューに入れることができます。次に、特定のアイテムを削除する必要があります。たとえば、アイテム1,2,3のキューからアイテム2を削除したい場合があり、アイテム2が最大/最小優先度値を持たない場合があります。

以下は、ブーストでペアリングキューを使用して作成したキューです。

#include "stdafx.h" 
#include <iostream> 
#include <boost/heap/pairing_heap.hpp> 
pairing_heap<float> pq; 

pq.push(1); 
pq.push(2.5); 
auto handle = pq.push(3.1); 
pq.erase(handle); // remove an element by handle 
cout << "pq top=" << pq.top() << endl; // a const_reference to the maximum element. 

あなたは、私が唯一のキューに優先順位の値をプッシュすることができていることがわかります、と私はアイテムを削除したい場合は、私はそのハンドル値を知っておく必要があります。しかし、大量のアイテムにハンドル値を与える方法はわかりません。それをやる方法を知っている人がいることを願っています。どうもありがとう!

+0

たぶん質問が十分に明確ではありません。私の場合、キュー内の各項目には2つの値があり、最初の値は1、2、3などのintで、2番目の値は優先順位値(float)です。私はアイテムの優先度を(int)1のような既知の最初の値で更新したいが、キューの現在の優先度の値や位置を知らない。結論として、アイテムの優先順位値やキュー内の位置ではなく、最初のint値でアイテムを操作する必要があります。どうもありがとう! –

答えて

0

あなたは "5" をs_handle_from_iterator

pq.update(Heap::s_handle_from_iterator(pq.begin()), pq.top()*2); 
std::cout << "pq top=" << pq.top() << std::endl; 

プリントを使用することができます。

それは掘削のビットを取ったが、私は操作が一定時間(ドキュメントがソースにd_ary_heapを指す)である旨docsを発見しました。

Live On Coliru

#include <boost/heap/pairing_heap.hpp> 
#include <iostream> 

int main() { 
    using Heap = boost::heap::pairing_heap<float>; 
    Heap pq; 

    pq.push(1); 
    pq.push(2.5); 
    auto handle = pq.push(3.1); 
    pq.erase(handle); // remove an element by handle 
    std::cout << "pq top=" << pq.top() << std::endl; // a const_reference to the maximum element. 

    pq.update(Heap::s_handle_from_iterator(pq.begin()), pq.top()*2); 
    std::cout << "pq top=" << pq.top() << std::endl; 
} 
+0

多くの感謝!私はあなたのコードがトップ値の優先順位を更新しようとしていることを理解しています。しかし、私の場合、キュー内の各項目には2つの値があり、最初の値は1、2、3などのintで、2番目の値は優先順位値(float)です。私はアイテムの優先度を(int)1のような既知の最初の値で更新したいが、キューの現在の優先度の値や位置を知らない。だから、s_handle_from_iteratorがこの場合にはうまくいきませんか?結論として、アイテムの優先順位値やキュー内の位置ではなく、最初のint値でアイテムを操作する必要があります。どうもありがとう! –

+0

キューはランダムアクセス用ではないことを理解しています。削除されたフラグを持つ要素にマークを付けるだけで、消費者がデキューすると、それをテストできませんか? 'if(!item.is_deleted()){/*...*/};' – sehe

関連する問題