[cpp] view plain copy
- #ifndef _vec_h
- #define _vec_h
- #include<memory>
- #include<algorithm>
- //#include<cstddef>
- template<class T> class Vec{
- public:
- typedef T* iterator;
- typedef const T* const_iterator;
- typedef size_t size_type;
- Vec() {create(); }
- explicit Vec(size_type n,const T& t=T()) {create(n,t);}
- Vec(const Vec& v) {create(v.begin(),v.end());} //复制构造函数跟构造函数一样,没有返回值
- Vec& operator=(const Vec&); //类外定义
- ~Vec() {uncreate();}
- T& operator[](size_type i) {return data[i];}
- const T& operator[](size_type i)const {return data[i];}
- iterator begin() {return data; }
- const_iterator begin() const{return data; }
- iterator end() {return avail; }
- const_iterator end() const {return avail; }
- size_type size() const{return avail-data;}
- void push_back(const T&);
- private:
- iterator data,avail,limit;
- std::allocator<T> alloc;
- void create();
- void create(size_type,const T&);
- void create(const_iterator,const_iterator);
- void uncreate();
- void grow();
- void unchecked_appended(const T&);
- };
- #endif
- template <class T> void Vec<T>::create(){
- data=avail=limit=0;
- }
- template <class T> void Vec<T>::create(size_type n,const T& t){
- data=alloc.allocate(n);
- avail=limit=data+n;
- std::uninitialized_fill(data,limit,t);
- }
- template <class T> void Vec<T>::create(const_iterator i,const_iterator j){
- data=alloc.allocate(j-i);
- avail=limit=std::uninitialized_copy(i,j,data);
- }
- template <class T> void Vec<T>::uncreate(){
- if(data){
- iterator i=avail;
- while(i!=data)
- alloc.destroy(--i);
- alloc.deallocate(data,limit-data);
- }
- data=avail=limit=0;
- }
- template <class T> void Vec<T>::grow(){
- size_type maxlen;
- maxlen=std::max(2*(limit-data),ptrdiff_t(1)); //确定vector容量
- iterator new_data,new_avail;
- new_data=alloc.allocate(maxlen); //申请未初始化的内存空间
- new_avail=std::uninitialized_copy(data,avail,new_data); //拷贝工作
- uncreate(); //删除工作
- data=new_data;
- avail=new_avail;
- limit=data+maxlen; //更新limit
- }
- template <class T> void Vec<T>::unchecked_appended(const T& v){
- alloc.construct(avail++,v); //特别注意这里在未初始化的内存中构造v对象
- }
- template <class T> Vec<T>& Vec<T>::operator=(const Vec& v){
- if(&v != this){
- uncreate();
- create(v.begin(),v.end());
- }
- return *this;
- }
- template <class T> void Vec<T>:: push_back(const T& v){
- if(avail==limit)
- grow();
- unchecked_appended(v);
- }
测试例程
[cpp] view plain copy
- #include"vec.h"
- #include<iostream>
- using namespace std;
- int main(){
- Vec<int> v;
- cout<<v.size()<<endl;
- v.push_back(1);
- v.push_back(12);
- v.push_back(51);
- v.push_back(136);
- Vec<int>::iterator i;
- for(i=v.begin();i!=v.end();i++)
- cout<< *i <<"\t";
- cout<<endl;
- Vec<int> v1=v;
- for(i=v1.begin();i!=v1.end();i++)
- cout<< *i <<"\t";
- cout<<endl;
- Vec<int> v3(v);
- for(i=v3.begin();i!=v3.end();i++)
- cout<< *i <<"\t";
- cout<<endl;
- v3.push_back(112);
- v3.push_back(172);
- v3.push_back(120);
- for(i=v3.begin();i!=v3.end();i++)
- cout<< *i <<"\t";
- }