问题描述
上下文
我有自己的具有减键功能的二叉堆实现。我在我的收缩层次结构实现中使用它。初始化 BinaryHeap 时,一切正常,但在构造完成后,BinaryHeap 的所有值都设置为 0(或类似 0 的值),因此堆属性不再成立。我认为这可能与 new
方法
错误详情
在BinaryHeap类中,保存堆信息的变量是items_
,一个指向Items<payload=int,value=float>
的指针向量。从具有负值和正值的成对向量(62 个元素)调用 BinaryHeap(pairs,handles)
时,items_
在构造函数中正确设置,并且 check()
(检查堆属性)运行完美。 在构造函数之外,我立即调用了 check()
,但它失败了(堆属性不再有效)。所有值现在都是 0 或 0-ish (3e-41),然后比较 assert(!less(index,parent))
失败(对于某些项目,0
我尝试过的事情:
- 使用 gdb,我检查了二叉堆的变量,items_ 仍然是一个有 62 项的有效向量,但所有值都是 0 或 0-ish 值 (3e-41)。没有内存泄漏,但是堆的信息丢失了。
- 如果我在隔离的测试环境中运行此二进制堆实现,则不会发生这种情况。 我不包括整个 BinaryHeap 实现,但我已经在所有基本情况下对其进行了测试,它运行良好,没有内存泄漏。
template <class Payload,class Value>
struct Item{
Payload id;
Value value;
int index;
Item(Payload id=-1,Value value=10,int index=1) : id(id),value(value),index(index) {};
};
template <class Payload,class Value>
class BinaryHeap {
public:
BinaryHeap(){
items_.resize(1);
}
// Builds a BinaryHeap from a vector of pairs
BinaryHeap(vector<std::pair<Payload,Value>> pairs,vector<Item<Payload,Value>*>& handles)
{
items_.resize(pairs.size()+1);
for (size_t i = 0; i < pairs.size(); i++)
{
items_[i+1] = new Item<Payload,Value>(pairs[i].first,pairs[i].second,i+1);
handles[i] = items_[i+1];
}
for (size_t i = items_.size()/2; i > 0 ; i--)
{
sink_down(i);
}
// works fine
check();
}
void check() const {
// check if heap property holds
if (size() > 1)
{
for (int index = 2; index <= size(); index++) {
int parent = parentOf(index);
assert(!less(index,parent));
assert(items_[index]->index == index);
}
}
}
int size() const {
return items_.size()-1;
}
private:
std::vector<Item<Payload,Value>*> items_;
bool less(int i1,int i2) const {
return items_[i1]->value < items_[i2]->value;
}
// Contraction hierarchies implementation,pqueue is a BinaryHeap.
pqueue = BinaryHeap(pairs,handles_CH);
// raises error
pqueue.check();
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)