2.11-12 滴水new-delete-vector(动态数组编写)

去长沙玩了几天,没学
1.new 与 delete

通过调用分析了解到new在堆区开辟数据 delete就是释放数据

案例
#include<stdio.h>
#include <malloc.h>
class ae
{
public:
	~ae()
	{
		printf("释放中");
	};
private:
};
int main(int argc, char* argv[])
{
	ae* a1 = new  ae[10];
	delete[] a1;
}
2.12 vector(动态数组编写) ![](https://img2023.cnblogs.com/blog/3001071/202302/3001071-20230211183500407-397745944.png)
案例2
.c文件
#include<stdio.h>	
#include"a.h"
void test1()
{
	
	Vector<int >* pvector = new Vector<int>(5);
	
	pvector->push_back(3);
	pvector->push_back(5);
	pvector->insert(1, 9);
	int a = 0;
	pvector->at(8,&a);
	printf("取出来的是%d", a);
	delete pvector;
}

int main()
{

	test1();
	return 0;
}




.h 文件
#include<Windows.h>
#define SUCCESS           			 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, OUT 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];
	printf("%x\n", m_pVector);
	
	//2.将新创建的空间初始化				
	memset(m_pVector, 0, m_dwInitSize * sizeof(T_ELE));
	//3.设置其他值
	m_dwLen = 100;
	m_dwIndex = 0;
	//// 返回

}
template <class T_ELE>
Vector<T_ELE>::Vector(DWORD dwSize)
	:m_dwIncrement(5)
{
	//1.创建长度为m_dwInitSize个T_ELE对象				
	m_pVector = new T_ELE[dwSize];
	printf("%x\n", m_pVector);
	//2.将新创建的空间初始化				
	memset(m_pVector, 0, dwSize * sizeof(T_ELE));
	//3.设置其他值
	m_dwLen = dwSize;
	m_dwIndex = 0;
	//// 返回
}
template <class T_ELE>
Vector<T_ELE>::~Vector()
{
	printf("释放成功");
	delete[] m_pVector;
	m_pVector = NULL;
}

template <class T_ELE>
BOOL Vector<T_ELE>::expand()
{


	T_ELE* m_ptemp = NULL;//地址
	///增加以后的长度
	// 1. 计算增加后的长度				
	DWORD dwTemplen = m_dwLen + m_dwIncrement;
	// 2. 申请空间				
	m_ptemp = new T_ELE[dwTemplen];

	// 3. 将数据复制到新的空间				
	memcpy(m_ptemp, m_pVector, sizeof(T_ELE) * m_dwLen);

	// 4. 释放原来空间				
	delete[] m_pVector;
	m_pVector = m_ptemp;
	m_ptemp = NULL;
	// 5. 为各种属性赋值				
	m_dwLen = dwTemplen;

	return true;
}

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>
DWORD  Vector<T_ELE>::insert(DWORD dwIndex, T_ELE Element)
{
	//1.判断是否需要增容,如果需要就调用增容的函数				
	if (m_dwIndex >= m_dwLen)
	{
		expand();
     }

	//2.判断索引是否在合理区间				
	if (dwIndex <0 || dwIndex > m_dwLen)
	{
		printf("输入错误");

	}

	//3.将dwIndex之后的元素后移				
	// 1  2  3 5 4  5   6 7 8 
	//4.将Element元素复制到dwIndex位置		
		for (int i = m_dwIndex; i >dwIndex; i--)
		{
			memcpy(&m_pVector[i], &m_pVector[i-1], sizeof(T_ELE));
		}
		memcpy(&m_pVector[dwIndex], &Element, sizeof(T_ELE));

	//5.修改属性值	
	 m_dwIndex++;
	 return SUCCESS;
}
template <class T_ELE>
DWORD Vector<T_ELE>::at(DWORD dwIndex, T_ELE* pEle)
{
	//判断索引是否在合理区间				
	if (dwIndex <0 || dwIndex > m_dwLen-1)
	{
		printf("输入错误 取出来的是乱码:\n");

	}
	//将dwIndex的值复制到pEle指定的内存				
	memcpy(pEle, &m_pVector[dwIndex], sizeof(T_ELE));
	return SUCCESS;
}

//其他函数。。自己实现					


posted @   逆向狗  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示