2011-11-29 6 views
0
난에 대한 간단한 래퍼를 작성했습니다

표준 : make_heap/push_heap/pop_heap :INVALID HEAP 사용하여 STL의 make_heap/push_heap/pop_heap

내가처럼 사용
template <typename T, typename Cont = std::vector<T>, typename Compare = std::less<typename Cont::value_type> > 
class Heap 
{ 
public: 
    inline void init() { std::make_heap(m_data.begin(), m_data.end(), Compare()); } 
    inline void push(const T & elm) { m_data.push_back(elm); std::push_heap(m_data.begin(), m_data.end(), Compare()); } 
    inline const T & top() const { return m_data.front(); } 
    inline void pop() { std::pop_heap(m_data.begin(), m_data.end(), Compare()); m_data.pop_back(); } 

private: 
    Cont m_data; 
}; 

:

class DeliveryComparator 
{ 
public: 
    bool operator()(Delivery * lhs, Delivery * rhs) 
    { 
     if(lhs->producer != rhs->producer) return *lhs->producer < *rhs->producer; 
     if(lhs->rate == rhs->rate) return lhs->diff < rhs->diff; 
     return lhs->rate < rhs->rate; 
    } 
}; 

Heap<Delivery*, std::vector<Delivery*>, DeliveryComparator> packages; 

하지만 가끔은 I INVALID HEAP 표준 디버그 메시지를받습니다. 적절한 힙 방법을 통해 힙을 사용합니다. 메시지가 발생하면 m_data는 비어 있지 않습니다.

힙이 잘못되었을 수 있습니까?

가 * 내가 (추가 대기 제외) 힙의 데이터를 편집 한 후

+3

왜'std :: priority_queue'를 사용하지 않습니까? – kennytm

+1

'std :: priority_queue'가 이미 힙 함수를 감싸는 래퍼가 아닌가? –

+0

비교기에'* lhs-> producer'가 생기면'lhs-> producer'가 될까요? –

답변

-1

MSVS2010를 사용하여 힙이 파괴되었다. 다음에 push_heap() 메소드를 사용하면이 예외가 발생합니다. push_heap() 대신 make_heap()을 사용해야합니다. 예를 들어 (btw, 다음 예제는 프로그램의 코드 조각입니다.)

if (highHeap[0] < solvedQuestions){ 
       lowHeap[lenghOfLowHeap++] = highHeap[0]; // *It only add a new item without destroy the heap 
       highHeap[0] = solvedQuestions; 
       // Update the Heap 
       push_heap(lowHeap, lowHeap + lenghOfLowHeap); 
       //push_heap(highHeap, highHeap + lenghOfHighHeap, greater<int>()); // invalid heap exception. Because the heap was destroyed by "highHeap[0] = solvedQuestions;" 
       make_heap(highHeap, highHeap + lenghOfHighHeap, greater<int>()); 
      } 
+0

"make_heap 함수를 호출하여 범위를 힙으로 만들 수 있습니다. 일단 생성되면 힙 속성이 될 수 있습니다 push_heap과 pop_heap을 사용하여 값을 추가하고 제거합니다. " - [push_heap] (http://www.cplusplus.com/reference/algorithm/push_heap/)에서 – relaxxx