#include<stdio.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(); //判断Vector是否为空 返回true时为空 VOID erase(DWORD dwIndex); //删除指定元素 DWORD size(); //返回Vector元素数量的大小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(T_ELE)); //3.设置其他值 m_dwIndex=0; m_dwLen = m_dwInitSize;}
template <class T_ELE> Vector<T_ELE>::Vector(DWORD dwSize):m_dwIncrement(dwSize) { //1.创建长度为dwSize个T_ELE对象 m_pVector = new T_ELE[dwSize]; //2.将新创建的空间初始化 memset(m_pVector,0,dwSize*sizeof(T_ELE)); //3.设置其他值 m_dwIndex=0; m_dwLen = dwSize;}template <class T_ELE> Vector<T_ELE>::~Vector() { //释放空间 delete[] delete[] m_pVector; m_pVector = NULL;}
template <class T_ELE> BOOL Vector<T_ELE>::expand() { // 1. 计算增加后的长度 int all = m_dwLen + m_dwIncrement; // 2. 申请空间 T_ELE* add = new T_ELE[all]; // 3. 将数据复制到新的空间 memcpy(add,m_pVector,sizeof(T_ELE) * m_dwLen); // 4. 释放原来空间 delete[] m_pVector; // 5. 为各种属性赋值 m_pVector = add; add = NULL; m_dwLen = all; return SUCCESS;}
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(dwIndex < 0 || dwIndex > m_dwIndex) { return INDEX_ERROR; } //2.判断是否需要增容,如果需要就调用增容的函数 if(m_dwIndex >= m_dwLen) { expand(); } //3.将dwIndex只后的元素后移 memcpy(((int*)(&m_pVector[dwIndex]))+1,&m_pVector[dwIndex],sizeof(T_ELE)*(m_dwIndex-dwIndex));
//4.将Element元素复制到dwIndex位置 memcpy(&m_pVector[dwIndex],&Element,sizeof(T_ELE));
//5.修改属性值 dwIndex++;} template <class T_ELE> DWORD Vector<T_ELE>::at(DWORD dwIndex,T_ELE* pEle) { //判断索引是否在合理区间 if(dwIndex < 0 || dwIndex >= m_dwIndex) { return INDEX_ERROR; } //将dwIndex的值复制到pEle指定的内存 memcpy(pEle,&m_pVector[dwIndex],sizeof(T_ELE));}
//其他函数。。自己实现
int main(){ Vector<int>* vector0=new Vector<int>(5); vector0->push_back(12); vector0->push_back(23); vector0->push_back(35); vector0->push_back(42); vector0->push_back(54); vector0->push_back(65);
vector0->insert(0,100); int a=0; vector0->at(2,&a); printf("%d\n",a); getchar();}