C++Dynamic_Array(vector)实现
发布日期:2021-05-08 04:53:58 浏览次数:20 分类:精选文章

本文共 5127 字,大约阅读时间需要 17 分钟。

头文件

#include 
using namespace std;#ifndef Dynamic_Num#define Dynamic_Numtemplate
class DynamicVector{ public: template
friend ostream &operator<<(ostream &out, const DynamicVector
&obj); DynamicVector() : array(NULL), mallocSize(0), numOfItems(0), virtualZero(0) { } DynamicVector(int index) : array(NULL), mallocSize(0), numOfItems(0), virtualZero(index) { } DynamicVector(T * const begin, T * const end,int index=0); DynamicVector(const DynamicVector &obj); DynamicVector
operator()(int begin, int end); //~DynamicVector() { if(array&&numOfItems) delete[] array; } void Reset(unsigned int size); void Copy_Basic(const DynamicVector
&obj); DynamicVector
&operator=(const DynamicVector
&obj); unsigned int length() const { return numOfItems; } unsigned int capacity() const { return mallocSize; } int firstIndex() const { return virtualZero; } T *begin() const { return &array[0]; } T *end() const { return &array[numOfItems]; } T &operator[](int index); bool operator==(const DynamicVector
&obj) const; void swap(DynamicVector
&obj); void insert(int index, const T &obj); inline void push_back(const T &obj); void push_back(const DynamicVector
&obj); void remove(); void remove(int index); void remove(int begin, int end); private: T *array = NULL; unsigned int mallocSize = 0, numOfItems = 0; int virtualZero = 0;};template
DynamicVector
:: DynamicVector(T * const begin, T * const end,int index):numOfItems(end-begin),virtualZero(index){ Reset(end - begin); int i = 0; for (T *ptr = begin; ptr <= end;++ptr){ array[i++] = *ptr; }}template
void DynamicVector
:: Reset(unsigned int size){ if(numOfItems&&array){ delete[] array; array = NULL; } array = new T[size]; mallocSize = size;}template
void DynamicVector
:: Copy_Basic(const DynamicVector
&obj){ mallocSize = obj.mallocSize; numOfItems = obj.numOfItems; virtualZero = obj.virtualZero; for (int i = 0; i < numOfItems;++i){ array[i] = obj.array[i]; }}template
DynamicVector
& DynamicVector
:: operator=(const DynamicVector
&obj){ Reset(obj.mallocSize); Copy_Basic(obj); return *this;}template
ostream &operator<<(ostream &out, const DynamicVector
&obj){ if(obj.numOfItems){ for (int i = 0; i < obj.numOfItems; ++i){ cout << obj.array[i] << " "; } } else{ cout << "The arrray is empty.\n"; } return out;}template
DynamicVector
::DynamicVector(const DynamicVector &obj){ Reset(obj.mallocSize); Copy_Basic(obj);}template
T &DynamicVector
::operator[](int index){ int pos = index - virtualZero; if(pos<0||pos>=numOfItems){ cerr << "you have enter a invalid data."; exit(1); } return array[pos];}template
bool DynamicVector
::operator==(const DynamicVector
&obj) const{ if(numOfItems==obj.numOfItems&&virtualZero==obj.virtualZero){ for (int i = 0; i < numOfItems;++i){ if(array[i]!=obj.array[i]) return false; } } return true;}template
DynamicVector
DynamicVector
::operator()(int begin, int end){ DynamicVector
temp(virtualZero); for (int i = begin-virtualZero; i < end-virtualZero;++i){ temp.push_back(array[i]); } return temp;}template
void DynamicVector
::insert(int index, const T &obj){ T *temp = new T[numOfItems]; for (int i = 0; i < numOfItems;++i) temp[i] = array[i]; if (numOfItems + 1 > mallocSize){ Reset(2 * mallocSize); } for (int i = 0; i < index-virtualZero; ++i){ array[i] = temp[i]; } array[index - virtualZero] = obj; for (int i = index - virtualZero,j=i+1; i < numOfItems;++i,++j){ array[j] = temp[i]; } delete[] temp; ++numOfItems;}template
inline void DynamicVector
::push_back(const T &obj){ if(numOfItems
void DynamicVector
::push_back(const DynamicVector
&obj){ if(mallocSize<=numOfItems+obj.numOfItems){ T *temp = new T[mallocSize]; for (int i = 0; i < numOfItems;++i) temp[i] = array[i]; Reset(mallocSize + obj.mallocSize); for (int i = 0; i < numOfItems;++i) array[i] = temp[i]; delete[] temp; temp = NULL; } for (int i = numOfItems; i < numOfItems + obj.numOfItems;++i) array[i] = obj.array[i - numOfItems]; numOfItems += obj.numOfItems;}template
void DynamicVector
::swap(DynamicVector
&obj){ T *temp= array;array = obj.array;obj.array = temp; unsigned t1 = obj.numOfItems;obj.numOfItems = numOfItems;numOfItems = t1; unsigned t2 = obj.mallocSize;obj.mallocSize = mallocSize;mallocSize = t2; int v = virtualZero;virtualZero = obj.virtualZero;obj.virtualZero = v;}template
void DynamicVector
::remove(){ --numOfItems;}template
void DynamicVector
:: remove(int index){ for (int i = index - virtualZero; i < numOfItems;++i) array[i] = array[i + 1]; --numOfItems;}template
void DynamicVector
:: remove(int begin, int end){ for (int i = begin-virtualZero; i < numOfItems;++i) array[i] = array[i + end - begin]; numOfItems -= (end - begin);}#endif

main.cpp

int main(){           DynamicVector
ra(-2); int i,n; cin>>n; cout<
raCopy(ra); cout<<"\n malloSize is "<
doubleVector1(&tmpx[1],&tmpx[n]); cout<<"\n numofItems is "<
doubleVector2(doubleVector1.begin(),doubleVector1.end(),-3); cout<<"\n numofItems is "<
上一篇:结构体内存布局`alignof`
下一篇:共享内存

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月28日 15时56分31秒