首先 为什么会要用静态单链表 单链表它不香吗?
主要是因为 单链表 大量的增加 和删除 会导致 堆空间 存在 大量内存水平 还会使 系统速度变慢;
借用顺序线性表的思路 不一定要在 堆上 申请空间 可以在其他位置申请任意的空间,所以才有了静态单链表;
#ifndef STATICLINKLIST_H
#define STATICLINKLIST_H
#include "LinkList.h"
namespace DTLib {
template <typename T,int N >
class StaticLinkList : public LinkList<T>
{
protected:
typedef typename LinkList<T>::Node Node;
struct SNode :public Node{
void* operator new(size_t size,void* loc){
(void)size;
return loc;
}
};
unsigned char m_space[sizeof(SNode) * N];
int m_used[N];
Node* create(){
//使用上面申请的空间 creat
SNode* ret = NULL;
for(int i=0;i<N;i++){
if(!m_used[i]){
//如果仅仅是这样 只是分配内存 并没有涉及到Node构造函数
ret = reinterpret_cast<SNode*>(m_space) + i; //这里的+i,什么意思 和上面一段连续的内存 有什么关系,可以自己测试一下
ret = new(ret)SNode();//这是什么方式(显示调用?)调用了构造函数
m_used[i]=1;
break;
}
}
return ret;
}
void destroy(Node *pn){
SNode* space = reinterpret_cast<SNode*>(m_space);
SNode* psn = dynamic_cast<SNode*>(pn); //从父类指针转化为 子类指针
for( int i =0;i<N;i++){
if(psn == (space +i)){
m_used[i]=0;
psn->~SNode();
break;
}
}
}
public:
StaticLinkList(){
for( int i =0;i<N;i++){
m_used[i]=0;
}
}
int capacity(){
return N;
}
//再不加析构函数 这个bug 导致我一直不能跑通相应的程序
//原因就是因为 调用父类的 destory函数的delete 删除了 我子类在其他空间(栈)的资源 而delete只能是删除堆上的空间
~StaticLinkList(){
this->clear();//这里为什么要加上析构函数? 这里clear 的对象就是 子列的destory() 函数了 为什么?因为多态性不会发生在构造 和析构函数
}
};
}
#endif // STATICLINKLIST_H
这里 有好几个点需要注意的(自己的盲点)
unsigned char m_space[sizeof(SNode) * N];这句话只是内存并不会调用NODE的构造函数
所以需要自己调用构造函数啦。
ret = new(ret)SNode();//这是什么方式(显示调用?)调用了构造函数new(要回头看一下c++) 重载 new ()
还有就是析构函数不支持 多态性的问题 这个是大问题了!