三.vector容器各类方法的实现
由于我们做逆向的人必须理解本质,不然的话如果逆向出来代码,也不知道这是vector的方法,源码贴在这里,源码中有详细的分析,大家自行阅读一边,会有更深的理解。
#include<iostream> #include<windows.h> #define success 1 #define error 0 using namespace std; template <class T_ELE> class vector{ public: vector(); vector(DWORD dwsize); ~vector(); private: DWORD m_dwIndex; //下一个可用索引 DWORD m_dwIncrement; //每次增加的容量 DWORD m_dwLen; //当前容器的实际大小 DWORD m_dwInitSize; //默认初始化的大小 int *pvector; //容器指针 public: DWORD capacity(); //获取当前容器容量 DWORD size(); //当前容器实际元素个数 DWORD push_back(T_ELE Elment); //向容器尾部添加元素(如果需要增容,需要调用增容函数) DWORD insert(DWORD dwIndex,T_ELE Element); //向指定位置添加元素 void pop_back(); //删除容器末尾元素 DWORD erease(DWORD dwIndex); //删除指定元素 void at(DWORD dwIndex); //根据索引得到元素 void clean(); //清空容器 private: bool expand(); }; template <class T_ELE> vector<T_ELE>::vector() :m_dwInitSize(100),m_dwIncrement(5){ //创建长度为m_dwInitSize个T_ELE对象,在堆中申请内存 pvector = new T_ELE[m_dwInitSize]; //初始化申请的内存 memset(pvector,0,m_dwInitSize*sizeof(T_ELE)); //设置其他值 m_dwLen = 100; m_dwIndex = 0; cout<<"无参构造函数完成。"<<endl; } template <class T_ELE> vector<T_ELE>::vector(DWORD dwsize) :m_dwIncrement(5){ //创建长度为dwsize个T_ELE对象,在堆中申请内存 pvector = new T_ELE[dwsize]; //初始化申请的内存 memset(pvector,0,dwsize*sizeof(T_ELE)); //设置其他值 m_dwLen = dwsize; m_dwIndex = 0; cout<<"有参构造函数完成。"<<endl; } template <class T_ELE> vector<T_ELE>::~vector(){ delete pvector; pvector = NULL; cout<<"析构函数完成。"<<endl; } template <class T_ELE> bool vector<T_ELE>::expand(){ //计算增加后的长度 int dwTempLen = m_dwLen + m_dwIncrement; //申请内存 T_ELE* ptemp = new T_ELE[dwTempLen]; //初始化申请的内存 memset(ptemp,0,dwTempLen*sizeof(T_ELE)); //复制原始内存中的值 memcpy(ptemp,pvector,m_dwLen*sizeof(T_ELE)); //释放原来空间,更新指针 delete[] pvector; pvector = ptemp; ptemp = NULL; //修改其它属性 m_dwLen = dwTempLen; cout<<"增容操作完成。"<<endl; return success; } template <class T_ELE> DWORD vector<T_ELE>::push_back(T_ELE Element){ //判断是否需要增容 if(m_dwIndex>=m_dwLen)expand(); //将新元素复制到容器最后一个位置 memcpy(&pvector[m_dwIndex],&Element,sizeof(T_ELE)); //修改其他属性 m_dwIndex++; m_dwLen++; return success; } template <class T_ELE> DWORD vector<T_ELE>::insert(DWORD dwIndex,T_ELE Element){ //判断是否需要扩容 if(m_dwIndex >= m_dwLen)expand(); //判断索引是否合理 if(dwIndex<0 || dwIndex>m_dwIndex){ cout<<"索引不合理。"<<endl; return error; } //将dwIndex之后的元素移动 //memset(&pvector[dwIndex],pvector,((m_dwIndex-dwIndex)*sizeof(T_ELE))); for(int i=m_dwIndex;i>=0;i--){ memcpy(&pvector[i+1],&pvector[i],sizeof(T_ELE)); } m_dwIndex++; //将Element复制到dwIndex pvector[dwIndex] = Element; //修改属性值 m_dwLen++; cout<<"添加元素成功。"<<endl; return success; } template <class T_ELE> void vector<T_ELE>::at(DWORD dwIndex){ //判断索引是否在合理区间 if(dwIndex<0 || dwIndex>=m_dwIndex){ cout<<"索引不合理"<<endl; return error; } //显示dwIndex的值并返回 cout<<pvector[dwIndex]<<endl; return pvector[dwIndex]; } template <class T_ELE> void vector<T_ELE>::clean(){ delete[] pvector; } void Test(){ vector<int>* v1 = new vector<int>(5); v1->push_back(0); v1->push_back(1); v1->push_back(2); v1->push_back(4); v1->push_back(5); v1->push_back(6); v1->push_back(7); v1->push_back(8); v1->push_back(9); v1->insert(3,3); } int main(){ Test(); return 0; }