最大堆的C++实现,及过程中遇到的一个小问题
2014-05-07 19:44
225 查看
template<class T> class MaxHeap{ public: MaxHeap(int MaxHeapSize = 10); ~MaxHeap(){ delete[] heap; } int Size()const{ return CurrentSize; } T Max()const; MaxHeap<T>& Insert(const T& x); MaxHeap<T>& DeleteMax(T& x); void Initialize(T a[], int size, int ArraySize); int GetCurrentSize()const; private: int CurrentSize, MaxSize; T *heap; }; template<class T> MaxHeap<T>::MaxHeap(int MaxHeapSize){ MaxSize = MaxHeapSize; heap = new T[MaxSize + 1]; CurrentSize = 0; } template<class T> T MaxHeap<T>::Max()const{ if (CurrentSize) return heap[1]; else throw OutOfBounds(); } template<class T> MaxHeap<T>& MaxHeap<T>::Insert(const T& x){ if (CurrentSize == MaxSize) throw OutOfBounds(); int i = ++CurrentSize; while (i != 1 && x > heap[i / 2]){ heap[i] = heap[i / 2]; i /= 2; } heap[i] = x; return *this; } template<class T> MaxHeap<T>& MaxHeap<T>::DeleteMax(T& x){ if (CurrentSize == 0) throw OutOfBounds(); x = heap[1]; T y = heap[CurrentSize--]; int i = 1, ci = 2; while (ci <= CurrentSize){ if (ci < CurrentSize&&heap[ci] < heap[ci + 1]) ci++; if (y >= heap[ci]) break; heap[i] = heap[ci]; i = ci; ci *= 2; } heap[i] = y; return *this; } template<class T> void MaxHeap<T>::Initialize(T a[], int size, int ArraySize){ delete[] heap; CurrentSize = size; MaxSize = ArraySize; heap = new T[MaxSize + 1]; for (int i = 0; i <= size; i++){ heap[i] = a[i]; } for (int i = CurrentSize / 2; i >= 1; i--){ T y = heap[i]; int c = 2 * i; while (c <= CurrentSize){ if (c < CurrentSize&&heap[c] < heap[c + 1]) c++; if (y >= heap[c]) break; heap[c / 2] = heap[c]; c *= 2; } heap[c / 2] = y; } } template<class T> int MaxHeap<T>::GetCurrentSize()const{ return CurrentSize; }
以上代码在VS2013中可以通过编译,实现最大堆的初始化,插入和删除操作。
但是第一遍写的时候照着书上写最大堆的初始化时出现了一个错误,先看一下代码。
template<class T> void MaxHeap<T>::Initialize(T a[], int size, int ArraySize){ delete[] heap; heap=a; CurrentSize = size; MaxSize = ArraySize; for (int i = CurrentSize / 2; i >= 1; i--){ T y = heap[i]; int c = 2 * i; while (c <= CurrentSize){ if (c < CurrentSize&&heap[c] < heap[c + 1]) c++; if (y >= heap[c]) break; heap[c / 2] = heap[c]; c *= 2; } heap[c / 2] = y; } }然后新建一个最大堆并调用初始化方法,出错! Debug发现初始化结束后数据组织上没有任何问题,百思不得其解。
然后百度了一下错误信息,才发现问题所在。
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
原来我用heap直接指向了a,在main方法结束之后,编译器先是释放了数组a所占的内存,然后调用MaxHeap的析构方法时再次尝试释放a时出错了。
至此问题得以解决。
相关文章推荐
- thrift实现一个C++实例遇到的问题
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题
- Touch001项目实现过程中遇到的一个技术问题
- 遇到的一个设计问题,两种方法的实现
- 实现鼠标钩子遇到的一个问题
- 第四章 最大子数组问题(股票最大收益) C++实现 算法导论
- 我在用dotnet做一个项目的过程中,遇到了一个ListBox的问题:通过在一个ListBox中双击,把选中的项添加到另一个ListBox中
- 算法设计与分析--求最大子段和问题(蛮力法、分治法、动态规划法) C++实现
- 自己安装cocopods过程遇到问题,菜鸟一个不喜勿喷!
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求
- 解决了安装kchmviewer的过程中遇到的一个小问题
- Asp.net forms认证遇到的一个奇怪的问题和测试过程
- Cursor使用过程中遇到的一个问题
- 基于pcDuino的WiFi视频监控小车实现过程中遇到的问题及解决方法
- 解决JS组件bootstrap table分页实现过程中遇到的问题
- 实现Android国际化过程中遇到的问题
- 搭建rtmp流媒体服务器过程中遇到的一个小问题
- c++开发过程中遇到的线程问题
- MyEclipse6.5整合flex实现与java简单通信过程中遇到的问题和注意事项
- 在通过android的广播机制拦截短信的实现过程中遇到的问题