滴水 C++_new、delete、vector 实现代码

#include "stdafx.h"
#include "windows.h"

#define SUCCESS 1   //成功
#define ERRORR 2   //失败
#define MALLOC_ERROR -3   //申请内存失败
#define INDEX_ERROR -4   //错误的索引号


template <class T_ele>
class Vector {
public:
	Vector();
	~Vector();
	Vector(DWORD DwSize);  //创建容器大小
public:
	DWORD at(DWORD dxIndex, OUT T_ele* p);  //根据给定序号索引拿到元素
	DWORD push_back(T_ele element); //把元素插入容器最后一个位置
	BOOL pop_back(); //删除最后一个元素
	DWORD insert(DWORD dwIndex, T_ele element); //向指定位置插入元素
	DWORD capacity(); //返回当前还剩多少容量
	void clear();  //清空所有元素
	bool empty(); //判断Vector是否为空
	BOOL erase(DWORD dwIndex); //删除指定元素
	DWORD size();  //返回Vector元素数量的大小
	void print();//测试打印
	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() {
	printf("\n成功调用析构函数");
	delete[] m_pVector;
	m_pVector = NULL;
}

template<class T_ele>
Vector<T_ele>::Vector(DWORD dwsize) {
	if (dwsize > 0) {
		m_dwInitSize = dwsize;
		m_pVector = new T_ele[m_dwInitSize];
		memset(m_pVector, 0, sizeof(T_ele)*m_dwInitSize);  //初始化分配的内存
		m_dwLen = m_dwInitSize; //设置长度
		m_dwIndex = 0;
	}
}


template<class T_ele>
Vector<T_ele>::Vector() :m_dwInitSize(100), m_dwIncrement(5)
{
	m_pVector = new T_ele[m_dwInitSize];  //创建100个T_ele类型的内存
	memset(m_pVector, 0, sizeof(T_ele)*m_dwInitSize);  //初始化分配的内存
	m_dwLen = m_dwInitSize; //设置长度
	m_dwIndex = 0;

}






template<class T_ele>
void Vector<T_ele>::clear() {
	memset(m_pVector, 0, sizeof(T_ele)*m_dwLen);
	m_dwIndex = 0;
	
}


//查询剩余容量
template<class T_ele>
DWORD Vector<T_ele>::capacity() {
	if (m_pVector)
	{
		return m_dwLen - m_dwIndex;
	}
	return ERRORR;
}


//删除指定元素
template<class T_ele>
BOOL Vector<T_ele>::erase(DWORD index) {
	if (index<0 || index>m_dwIndex) {
		return false;
	}
	if (index > m_dwLen) {
		return false;
	}
	//是否需要增加容量
	if (m_dwIndex >= m_dwLen) {
		expand();//添加容量
	}
	//T_ele* p = new T_ele[m_dwLen];//创建新容器
	//将index之后的元素前移一位,这里需要注意的是i=index+1
	for (DWORD i = index + 1; i < m_dwIndex; i++) {
		memcpy(m_pVector + (i - 1), m_pVector + i, sizeof(T_ele));
	}
	pop_back();

}


template<class T_ele>
BOOL Vector<T_ele>::expand() {
	if (m_dwIndex >= m_dwLen) {
		//创建一个新容器
		T_ele* p = new T_ele[m_dwLen + m_dwIncrement];
		//复制原来容器元素到新容器
		memcpy(p, m_pVector, sizeof(T_ele)*m_dwLen);
		//删除原数据
		delete[] m_pVector;
		m_pVector = p;
		m_dwLen = m_dwLen + m_dwIncrement;
		return true;
	}
	else
	{
		printf("当前容量充足");

	}
	return false;
}


template<class T_ele>
DWORD Vector<T_ele>::insert(DWORD dxIndex, T_ele element) {

	//首先判断索引是否在合理区间
	if (dxIndex<0 || dxIndex>m_dwIndex) {
		return INDEX_ERROR;
	}
	//是否需要增加容量
	if (m_dwIndex >= m_dwLen) {
		expand();//添加容量
	}
	//将dxIndex之后的元素后移
	if (m_pVector) {
		for (DWORD i = m_dwIndex; i > dxIndex; i--) {
			memcpy(m_pVector + i, m_pVector + (i - 1), sizeof(T_ele));
		}
		memcpy(m_pVector + dxIndex, &element, sizeof(T_ele));
		m_dwIndex++;
		return SUCCESS;
	}

	return INDEX_ERROR;


}

template<class T_ele>
BOOL Vector<T_ele>::pop_back() {
	/*if (m_dwLen > 0) {
	memset(m_pVector + m_dwLen, 0, sizeof(T_ele));
	m_dwLen--;
	}
	*/

	//下面这个是删除当前元素中最后一个元素的方法,上面注释那个是删除整个容器最后一个容器
	if (m_dwIndex>0) {
		memset(m_pVector + (m_dwIndex - 1), 0, sizeof(T_ele));
		m_dwIndex--;
		return true;
	}


}

template<class T_ele>
DWORD Vector<T_ele>::push_back(T_ele element) {
	*(m_pVector + m_dwLen) = element;
	return m_pVector + m_dwLen;
}



template<class T_ele>
DWORD Vector<T_ele>::size() {
	return m_dwLen;
}

template<class T_ele>
bool Vector<T_ele>::empty() {
	if (m_pVector == NULL or m_dwIndex = 0) {
		return true;
	}
	return false;
}

template<class T_ele>
void Vector<T_ele>::print() {
	//DWORD m_dwIndex;   //下一个可用索引
	//DWORD m_dwIncrement;   //每次增加的容量
	//DWORD m_dwLen;  //当前容器长度
	//DWORD m_dwInitSize; //   默认初始化大小
	//T_ele* m_pVector;  //容器指针

	printf("\n容器指针:%#x\n下一个可用索引:%d\n每次增加的容量:%d\n当前容器长度:%d\n默认初始化大小:%d\n", m_pVector, m_dwIndex, m_dwIncrement, m_dwLen, m_dwInitSize);
	for (DWORD i = 0; i < m_dwIndex; i++) {
		printf("第%d个元素:%d\n", i, *(m_pVector + i));
	}
}



template<class T_ele>
DWORD Vector<T_ele>::at(DWORD dxIndex, OUT T_ele* p) {
	if (m_pVector) {
		p = dxIndex + m_pVector;
		return (DWORD)*p;
	}
	return ERRORR;
}




void Test() {
	int* N = NULL;
	Vector<int>* p = new Vector<int>(50000);
	
	p->insert(0, 12);
	p->print();
	p->erase(1);
	p->print();
	//p->clear();
	p->print();
	printf("\n指定定序号的元素是:%d\n", p->at(1, N));
	printf("\n剩余容量::%d\n", p->capacity());
	delete p;
}


int main()
{
	while (true) {
		Test();
	}
	
	//getchar();
	return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值