【发布时间】:2012-01-09 04:52:34
【问题描述】:
我已经为 std::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;
但有时我会收到 INVALID HEAP 标准调试消息。 我只是通过适当的堆方法使用堆。当消息发生时,m_data 不为空。
堆有什么问题?
*我用的是MSVS2010
【问题讨论】:
-
为什么不使用
std::priority_queue? -
std::priority_queue不是已经是堆函数的封装了吗? -
你的比较器中是否有一些额外的
*,即*lhs->producer,应该只是lhs->producer? -
@KennyTM 和Kerrek:哦,我完全忘记了priority_queue,谢谢。无论如何,我的堆有问题吗?
-
@DarrenEngwirda 那些星星是必要的,生产者是指针类型,我不想比较地址,而是在生产者实例中调用 operator