动态内存分配
- new int 等价与malloc(sizeof(int)),没有初始值。
- new int(5),将申请的Int大小的空间初始化为5。
- Node为定义的结构体/类,Node * p = new Node;等价于Node *p = (Node *)malloc(sieof(Node));。
- new int ,delete 。new [] , delete[]。
#include<stdio.h>
#include<iostream>
class Base
{
public:
Base()
{
printf("Base start \n");
}
~Base()
{
printf("~Base start \n");
}
};
int main(int argc,char *argv[])
{
Base *b;
b = new Base[5];
delete []b;
return 0;
}
Vector
- 本质就是一个数组。
- 可以动态扩充容量的。
- 支持下标的方法,查询性能好。
- 新增数据和删除数据较差。
#include<stdio.h>
#include<iostream>
#define SUCCESS 1//成功
#define ERROR -1//失败
#define MALLOC_ERROR -2//申请动态内存失败
#define INDEX_ERROR -3//错误的索引号
template<class T_ELE>
class Vector
{
public:
Vector();
Vector(DWORD dwSize);
~Vector();
public:
DWORD at(DWORD dwIndex,T_ELE * pEle);
DWORD push_back(T_ELE Element);
VOID pop_back();
DWORD insert(DWORD dwIndex,T_ELE Element);
DWORD capacity();
VOID clear();
BOOL empty();
VOID erase(DWORD dwIndex);
DWORD size();
private:
BOOL expand();
private:
DWORD m_dwIndex;
DWORD m_dwIncrement;
DWORD m_dwLen;
DWORD m_dwInitSize;
T_ELE *m_pVector;
};
template <class T_ELE>
Vector<T_ELE>::Vector()
:m_dwInitSize(100),m_dwIncrement(5)
{
//1.创建长度为m_dwInitSize个T_ELE类型对象
m_pVector = new T_ELE[m_dwInitSize];
//2.将新创建的空间初始化
memset(m_pVector,0,m_dwInitSize*sizeof());
//3.设置其他值
m_dwLen = 100;
m_dwIndex = 0;
}
template <class T_ELE>
{
//释放空间
delete[] m_pVector;
m_pVector = NULL;
}
template <class T_ELE>
DWORD Vector<T_ELE>::push_back(T_ELE Element)
{
//1.判断是否需要增容,如果需要就调用增容函数
if(m_dwIndex >= m_dwLen)
{
expand();
}
//2.将新的元素赋值到容器的最后一个位置
memcpy(m_pVector[m_dwIndex],&Element,sizeof(T_ELE));
//3.修改 属性值
m_dwIndex++;
return SUCCESS;
}
template <class T_ELE>
BOOL Vector<T_ELE>::expand()
{
DWORD dwTempLen = 0;
T_ELE *pTemp = NULL;
//1.计算增加后的长度
dwTempLen = m_dwLen + m_dwIncrement;
//2.申请空间
pTemp = new T_ELE[dwTempLen];
//3.将数据复制到新的空间
memcpy(pTemp,m_pVector,sizeof(T_ELE)*m_dwLen);
//4.释放原来的空间
delete[] m_pVector;
m_pVector = pTemp;
pTemp = NULL;
//5.为各种属性赋值
m_dwLen = dwTempLen;
return true;
}
template <class T_ELE>
DWORD Vector<T_ELE>::insert(DWORD dwIndex,T_ELE Element)
{
//1.判断索引是否在合理区间
if(dwIndex < 0 || dwIndex > m_dwIndex)
{
return INDEX_ERROR;
}
//2.判断是否需要增容,如果需要就调用增容的函数
if(m_dwIndex >= m_dwLen)
{
expand();
}
//3.将dwIndex之后的元素后移
for(int i = m_dwIndex; i > dwIndex; i--)
{
memcpy(&m_pVector[i],&m_pVector[i-1],sizeof(T_ELE));
}
//4.将Element元素复制到dwIndex的位置
memcpy(&m_pVector[dwIndex],&Element,sizeof(T_ELE));
//5.修改属性值
m_dwIndex++;
}
template <class T_ELE>
DWORD Vector<T_ELE>::at(DWORD dwIndex,T_ELE * pEle)
{
//1.判断索引是否在合理区间
if(dwIndex < 0 || dwIndex >= m_dwIndex)
{
return INDEX_ERROR;
}
//2.将dwIndex的值复制到pEle指定的内存
memcpy(pEle,&m_pVector[dwIndex],sizeof(T_ELE));
}
void test(void)
{
Vector<int>* pVector = new Vector<int>(5);
pVector->push_back(1);
pVector->push_back(2);
pVector->push_back(3);
pVector->push_back(4);
pVector->insert(5,9);
int x = 0;
pVector->at(2,&x);
printf("%d\n",x);
}
int main(int argc,char*argv[])
{
test();
}