#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;
}
滴水 C++_new、delete、vector 实现代码
最新推荐文章于 2023-11-25 16:29:54 发布