//=============================================== //一个简单的vector模版,实现了vector的简 //单功能。申请内存,通过指向前后的2 //个指针,不断的更新数据。 //插入,和删除比较麻烦,需要对数据进行移动。 //=============================================== //=============================================== //这个文件是Tvector.h文件 //=============================================== #pragma once ////////每次分配内存的大小的增量 #define SIZE_ONCE 100 #include <iostream> #include <assert.h> typedef unsigned int size_u; template<class _Ty> class Tvector { public: typedef _Ty value; typedef value* itor; public: //////////////缺省构造函数///////////////////////////////////////// Tvector() { _size = SIZE_ONCE; _len = 0; _pFirst = new value[_size + 1]; memset(_pFirst,0,sizeof(value)*(_size + 1)); _pLast = _pFirst; } //////////////带参构造函数///////////////////////////////////////// Tvector(value val,size_u n) { if(n < 1) { Tvector(); return ; } _size = SIZE_ONCE; size_u cout = n / _size + 1; _size = cout * SIZE_ONCE; _pFirst = new value[_size + 1]; _pLast = _pFirst; for(size_u i = 0; i < n; ++i) *_pLast++ = val; _len = n; } ///////////////析构函数///////////////////////////////////////// ~Tvector() { destory(_pFirst); } /////////////下标访问////////////////////////////////////// value& operator[] (size_u index) { if(empty()) assert("Tvector为空!"); if (index < 0 || index > _len - 1) assert("pos越界!"); return _pFirst[index]; } ////////////获取某个元素//////////////////////////////// value& at(size_u pos) { if(empty()) assert("Tvector为空!"); if (pos < 0 || pos > _len - 1) assert("pos越界!"); return _pFirst[pos]; } ///////////从后面插入元素//////////////////////////// void push_back(value val) { itor tem = allot_again(1); if(tem) { itor _pOldF = _pFirst; _pFirst = (itor)memcpy(tem,_pFirst,sizeof(value)*_len); _pLast = _pFirst + _len++; *_pLast++ = val; destory(_pOldF); } else { *(_pLast++) = val; ++_len; } } /////////从后面弹出元素/////////////////////////// value pop_back() { if(empty()) assert("Tvector为空!"); value tem = *_pLast; memset(_pLast,0,sizeof(value)); --_pLast; --_len; return tem; } //////////删除pos位置元素/////////////////////// itor earse(itor _pos) { if(_pos == _pLast) assert(false); size_u _si = _pLast - _pos; move_forward(_pos,_pos + 1,_si - 1); memset(_pLast,0,sizeof(value)); --_pLast; --_len; return _pos; } itor earse(itor _begin,itor _end) { } //////////在pos后面插入元素/////////////////// itor insert(itor pos,value val) { if(pos == _pLast || empty()) assert(false); itor tem = allot_again(1); if(tem) { itor _pOldF = _pFirst; int a = int(pos - _pFirst) + 1; int b = int(_pLast - pos - 1); _pFirst =(itor) memcpy(tem,_pFirst,a*sizeof(value)); *(_pFirst + a ) = val; memcpy(_pFirst + a + 1,pos + 1,b*sizeof(value)); _len++; _pLast = _pFirst + _len + 1; destory(_pOldF); return (_pFirst + a + 1); } else { move_backward(pos + 1,pos + 2,_pLast - pos -1 ); *(pos+1) = val; ++_pLast; ++_len; return pos; } } itor insert(itor pos,value val,size_u n) { } ///////////清空元素////////////////////// void clear() { memset(_pFirst,0,sizeof(value)*(_len + 1)); _pLast = _pFirst + 1; _len = 0; } ///////////是否为空////////////////////// bool empty() { return 0 == _len; } ///////////返回元素个数////////////////////// size_u size() { return _len; } ///////////返回开始元素指针////////////////////// itor begin() { return _pFirst; } ///////////返回最后元素指针////////////////////// itor end() { return _pLast; } private: void move_forward(itor des,itor res,size_u n) { if(des == res || n < 1) return; for(size_u i = 0;i < n;++i) *des++ = *res++; } void move_backward(itor res,itor des,size_u n) { if(des == res || n < 1) return; itor tem = new value[n]; memcpy(tem,res,n*sizeof(value)); memcpy(des,tem,n*sizeof(value)); delete[] tem; } itor allot_again(size_u _n) { itor tem = NULL; if(_len + _n > _size) { _size = ((_len + _n) / SIZE_ONCE + 1)*SIZE_ONCE ; tem = new value[_size + 1]; memset(tem,0,sizeof(value)*(_size+1)); } return tem; } void destory(itor tem) { if(tem) delete[] tem; } private: itor _pFirst; itor _pLast; size_u _size; size_u _len; };
测试
// #include "stdafx.h" #include <time.h> #include <iostream> #include <string> #include "Tvecor.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string kstr1 = "cainiao1"; string kstr2 = "cainiao2"; string kstr3 = "cainiao3"; string kstr4 = "cainiao4"; string kstr5 = "cainiao5"; string kstr6 = "cainiao6"; string kstr7 = "cainiao7"; Tvector<string> kvet; kvet.push_back(kstr1); kvet.push_back(kstr2); kvet.push_back(kstr3); kvet.push_back(kstr4); for(Tvector<string>::itor it = kvet.begin();it!=kvet.end();++it) { cout<< *it << endl; } cout<<endl; kvet.push_back(kstr5); kvet.push_back(kstr6); for (unsigned int i=0; i<kvet.size();++i) { cout<<kvet[i] << endl; } cout<<endl; kvet.earse(kvet.begin()+2); for (unsigned int i=0; i<kvet.size();++i) { cout<<kvet[i] << endl; } cout<<endl; kvet.pop_back(); for (unsigned int i=0; i<kvet.size();++i) { cout<<kvet[i] << endl; } cout<<endl; system("pause"); return 0; }
测试结果