动态数组的C++实现动态数组在C++中有广泛的应用,但实现起来比较麻烦。这是我编写的一个动态数组的实现程序,程序的大部分功能都能实现,比如插入元素、向动态数组末尾追加元素、显示动态数组的大小、显示动态数组的容量、显示动态数组的元素。还有一些功能我虽然写了实现函数,但没有测试程序的结果,只写了最常见的几种操作。程序的最大优点是测试程序方便。程序代码/**Array.cpp**Createdon:2011-1-19*Author:jiayanbo*/#includeiostream#includestdexcept#includecstring#includeiteratorusingnamespacestd;//定义一个动态数组类classArray{int_size;int_capacity;int*items;public:typedefint*iterator;typedefconstint*const_iterator;enum{DEFAUL_CAP=16};explicitArray(constint&capcity=DEFAUL_CAP);Array(constArray&other);Array&operator=(constArray&other);~Array();iteratorbegin();const_iteratorbegin()const;iteratorend();const_iteratorend()const;constint&operator[](constint&index)const;int&operator[](constint&index);voidinsert(constint&index,constint&value);voidremove(constint&index);voidappend(constint&value);intsize()const;intcapacity()const;boolempty()const;voidrun();};//构造函数Array::Array(constint&capcity):_size(0),_capacity(capcity){items=newint[_capacity];}//copy构造函数Array::Array(constArray&other):_size(other._size),_capacity(other._capacity){items=newint[_capacity];//for(inti=0;i_size;++i)//items[i]=other.items[i];std::memcpy(items,other.items,_size*sizeof(int));}//运算符=重载Array&Array::operator=(constArray&other){if(&other!=this){_size=other._size;_capacity=other._capacity;delete[]items;items=newint[_capacity];std::memcpy(items,other.items,_size*sizeof(int));}return*this;}//查找数组开始位置Array::iteratorArray::begin(){returnitems;}//查找数组开始位置(不能改变)Array::const_iteratorArray::begin()const{returnitems;}//查找数组结束位置Array::iteratorArray::end(){returnitems+_size;}//查找数组结束位置(不能改变)Array::const_iteratorArray::end()const{returnitems+_size;}//查找数组中index下标的元素constint&Array::operator[](constint&index)const{if(index0||_size=index)throwstd::out_of_range(Array::operator[](constint&)const);returnitems[index];}//查找数组中index下标的元素(不能改变其大小)int&Array::operator[](constint&index){if(index0||_size=index)throwstd::out_of_range(Array::operator[](constint&)const);returnitems[index];}//在动态数组中插入元素voidArray::insert(constint&index,constint&value){if(index0||_size=index)throwstd::out_of_range(Array::insert(constint&,constint&));if(_size_capacity){std::memmove(items+(index+1),items+index,(_size-index)*sizeof(int));items[index]=value;}else{_capacity*=2;int*tmp=newint[_capacity];std::memcpy(tmp,items,index*sizeof(int));std::memcpy(tmp+(index+1),items+index,(_size-index)*sizeof(int));tmp[index]=value;delete[]items;items=tmp;}++_size;}//在动态数组末尾追加元素voidArray::append(constint&value){if(_size_capacity){items[_size]=value;}else{_capacity*=2;int*tmp=newint[_capacity];std::memcpy(tmp,items,_size*sizeof(int));tmp[_size]=value;delete[]items;items=tmp;}++_size;}//删除动态数组的元素voidArray::remove(constint&index){if(index0||_size=index)throwout_of_range(Array::remove(constint&));--_size;if(index!=_size)//_sizealreadydecreased.memmove(items+index,items+(index+1),(_size-index)*sizeof(int));//for(inti=index;i_size;++i)//items[i]=items[i+1];}//查找动态数组的大小intArray::size()const{return_size;}//查找动态数组的容量intArray::capacity()const{return_capacity;}//判断动态数组是否为空boolArray::empty()const{return0==_size;}//运行函数voidArray::run(){charkey;inti,num,value;cout请输入你的选择:\t;cinkey;while(key!='0'){switch(key){case'1':{cout请输入插入元素的位置:\t;cinnum;cout请输入插入元素的值:\t;cinkey;insert(num,key);break;}case'2':{cout请输入追加元素的值:\t;cinkey;append(key);break;}case'3':{cout动态数组的大小为:\tsize()endl;break;}case'4':{cout动态数组的容量为:\tcapacity()endl;break;}case'5':{cout请输入你想删除的元素的位置:\t;cinnum;remove(num);break;}default:break;}cout请输入你的选择:\t;cinkey;}}//析构动态数组Array::~Array(){delete[]items;}intmain(){Arraya(10);cout********请输入你想对动态数组的操作:(按0退出程序)**********endl;cout******1、插入元素,2、追加元素,3、查看数组的大小,********endl;cout***********4、查看数组的容量,5、删除元素***************endl;a.run();}运行结果:1、********请输入你想对动态数组的操作:(按0退出程序)****************1、插入元素,2、追加元素,3、查看数组的大小,**********4、查看数组的容量,5、删除元素、6显示动态数组中的元素***请输入你的选择:1请输入插入元素的位置:2请输入插入元素的值:2terminatecalledafterthrowinganinstanceof'std::out_of_range'what():Array::insert(constint&,constint&)已放弃2、********请输入你想对动态数组的操作:(按0退出程序)****************1、插入元素,2、追加元素,3、查看数组的大小,**********4、查看数组的容量,5、删除元素、6显示动态数组中的元素***请输入你的选择:2请输入追加元素的值:6请输入你的选择:2请输入追加元素的值:8请输入你的选择:2请输入追加元素的值:7请输入你的选择:2请输入追加元素的值:3请输入你的选择:1请输入插入元素的位置:2请输入插入元素的值:3请输入你的选择:3动态数组的大小为:5请输入你的选择:4动态数组的容量为:10请输入你的选择:5请输入你想删除的元素的位置:2请输入你的选择:4动态数组的容量为:10请输入你的选择:3动态数组的大小为:4请输入你的选择:0补充说明:这是在linux系统下的gcc编程通过的,如果在VC下运行,可以把#includecstring改为#includestring.h应该没有问题。因为在gcc环境下,C++用C的库的话,必须包含的文件名前面加c.