欢迎来到天天文库
浏览记录
ID:32945790
大小:81.27 KB
页数:17页
时间:2019-02-18
《必须要注意的c动态内存资源管理(六)vector的简单实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、必须要注意的C++动态内存资源管理(A)vector的简单实现myVector分析我们知道,vector类将英元素存放在连续的内存中。为了获得可接受的性能,vetor预先分配足够大的内存来保存可能需要的更多元素。vector的每个添加元素的成员函数会检杳是否有空间容纳更多的元素。如果有,成员函数会在下一个可用位置构造一个对象。如果没有可用空间,vector就会重新分配空间;它获得新的空间,将已有元素移动到新空间中,释放旧空间,并添加新元素。既然是动态开辟的内存,于是我们在myVector中使用动态数组來存储,而每次插入元素的时候需要先判断开辟的内存是否已满,如果满了需耍重新分配内存。下面
2、给出最初版本的代码://myVector.h#include<memory>template<typenamet二””>classmyVector{public:typedefmyVector<t>_Myt;myVector():elements(nullptr),first_free(nullptr),cap(nullptr){}//allocator成员进行默认初始化myVector(const_Myt&);_Myt&operator=(const_Myt&);"myVector();T&operator[](siz
3、e_ti){return*(elements+i);}voidpush_back(constT&);//添加元素size_tsize()const{returnfirst__free・elements;}size_tcapacity()const{returncap・elements;}T*begin()const{returnelements;}T*end()const{returnfirst_free;}voidchk_n()private:〃被添加元素函数使用if(size()==capacity())reallocate();std::pair>n_copy(con
4、stT*,constT*);〃被拷贝构造,赋值运算符,析构函数使用voidfree();〃销毁元素并释放内存voidreallocate();〃获得更多内存并拷贝已有元素T*elements;T*first_free;T*cap;};template<typenamet="">myVector<t>::myVector(const_Myt&v)〃调用alloc_n_copy分配空间以容纳与s屮一样多的元素autonewdata=n_copy(v.begin(),v.endf));elements=newdata.first;first_free=cap=n
5、ewdata.second;}template<typenamet="">myVector<t>::"myVector()free();template<typenamet="">myVector<t>&myVector<t>::operator=(const_Myt&rhs)〃调用alloc_n_copy分配内存'大小与rhs一样.autodata=n_copy(rhs.begin(),rhs.end());free();elements=data.first;first_free=cap=data.secon
6、d;return*this;template<typenamet=,H,>std::pair<t*,>myVector<t>::n_copy(constT*b,constT*e)autodata=newT[e-b];for(autoi=b;i<e;i++)data[i-b]=*i;return{data,data+(e-b)};}template<typenamet二”">voidmyVector<t>::push_back(constT&s)chk_n();〃确保己有新空间*(first_free++)=s;te
7、mplate<typenamet=,H,>voidmyVector<t>::free()delete[]elements;template<typenamet="">voidmyVector<t>::reallocate(){〃我们将分配当前大小两倍的内存空间autonewcapacity=size()?2*size():1;〃分配新内存autonewdata=newT[newcapa
此文档下载收益归作者所有