2014-02-13 31 views
0

我創建了一個事件優先級隊列,它按Event.time排序。我插入了5個事件,並且它工作得很好(它們按照Event.time的順序排序)。然而,在我彈出()之後,剩下的隊列無序(不再排序)。有人可以幫我解釋爲什麼嗎?非常感謝。在彈出後C++中的優先隊列出現故障()

struct Event 
{ 
    string name; 
    int time; 
    int pid; 
}; 

class CompareEvent 
{ 
public: 
    bool operator()(Event& event1, Event& event2) 
    { 
     if (event1.time > event2.time) 
      return true; 

     return false; 
    } 
}; 

主類

priority_queue<Event, vector<Event>, CompareEvent> eventList; 

    Event newEvent; 
    newEvent.name = eventName; 
    newEvent.time = time; 
    newEvent.pid = pid; 

eventList.push(newEvent); 

eventList.pop(); // the remaining items are not in order anymore 

更新的解決方案:我調試的程序,我看着在調試窗口EVENTLIST值。值不排序。但是,它總是返回top()時的最低值。這些值不會在內部排序。感謝讓我意識到這一點。

+3

你不是爲了什麼意思?你是否試圖將所有東西都彈出來並觀察它們的順序不正確?看來你的'eventList'在'pop()'後面沒有元素。 – Haozhun

+2

你如何查看剩餘物品的訂單?請注意,優先級隊列通常是以堆的形式實現的,即它不是在內部進行排序。 – Angew

+0

只是一個側面說明,但通過將'operator()'聲明爲'struct'並將其定義爲'return event1.time> event2.time',可以省略一些行。當然,我想補充一下這個問題,你如何檢查,項目是不是有序。一段代碼可以再現巴哈維奇的風格。即使它有點長,當有人能夠運行它並立即檢查自己時,它是很好的。 – luk32

回答

1

如果您需要隨時排序的事件,您必須sort或使用排序容器,如setmappriority_queue只保證pop()返回其中最低的元素之一(頂部)。

2

優先隊列不需要排序。只有要求是堆屬性 - 如果您調用pop()top(),它必須返回頂層元素(給定排序函數的最低元素)。

如果您需要使容器保持排序的容器,請使用std::setstd::map