C++NEW、DELETE、VECTOR

博客介绍了动态内存分配相关内容,如new int等价于malloc(sizeof(int)),new int(5)可初始化空间;还提到Node类型用new申请空间与malloc的等价情况。同时介绍了Vector,它本质是数组,能动态扩充容量,查询性能好,但新增和删除数据较差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态内存分配

  1. new int 等价与malloc(sizeof(int)),没有初始值。
  2. new int(5),将申请的Int大小的空间初始化为5。
  3. Node为定义的结构体/类,Node * p = new Node;等价于Node *p = (Node *)malloc(sieof(Node));。
  4. 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

  1. 本质就是一个数组。
  2. 可以动态扩充容量的。
  3. 支持下标的方法,查询性能好。
  4. 新增数据和删除数据较差。
#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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值