📄 11-0.cpp
字号:
#include<iostream>
#include<memory>
#include<string>
using std::string;
using std::cout;
using std::endl;
using std::cin;
using std::allocator;
using std::_MAX;
using std::uninitialized_copy;
using std::uninitialized_fill;
template <class T> class Vec
{
public:
typedef T* iterator;
typedef const T* const_iterator;
typedef size_t size_type;
typedef T value_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];}
void push_back(const T& t)
{
if(avail==limit)
grow();
unchecked_append(t);
}
size_type size() const {return avail-data;}
iterator begin() { return data;}
const_iterator begin() const { return data;}
iterator end() { return avail;}
const_iterator end() const { return avail; }
private:
iterator data; //first element in the Vec
iterator avail; //(one past) the last of element in the Vec
iterator limit; //(one past) the allocated menory
//facilities for memory allocation
allocator<T> alloc; //object to handle memory allocation
//allocation and initialize the underlying array
void create();
void create(size_type,const T&);
void create(const_iterator, const_iterator);
//destroy the element in the array and free the memory
void uncreate();
//support funcions for push_back
void grow();
void unchecked_append(const T&);
};
template<class T>
Vec<T>& Vec<T>::operator =(const Vec& rhs)
{
//check for self-assignment
if(&rhs!=this)
{
//free the array in the left-hand side
uncreate();
//copy elements from the right-hand to the left-hand side
create(rhs.begin(),rhs.end());
}
return *this;
}
template <class T> void Vec<T>::create()
{
data=avail=limit=0;
}
template <class T> void Vec<T>::create(size_type n, const T& val)
{
data=alloc.allocate(n,0);
limit=avail=data+n;
uninitialized_fill(data,limit,val);
}
template <class T>
void Vec<T>::create(const_iterator i,const_iterator j)
{
data=alloc.allocate(j-i,0);
limit=avail=uninitialized_copy(i,j,data);
}
template <class T> void Vec<T>::uncreate()
{
if(data)
{
//destroy (in reverse orde) the elements that were constructed
iterator it=avail;
while(it!=data)
alloc.destroy(--it);
//return all the space that was allocated
alloc.deallocate(data,limit-data);
}
//reset pointers to indicate that the Vec is empty again
data=limit=avail=0;
}
template <class T> void Vec<T>::grow()
{
//when growing, allocate twice as much space as currently in use
size_type new_size=_MAX(2*(limit-data),ptrdiff_t(1));
//allocate new space and copy existing elements to the new space
iterator new_data=alloc.allocate(new_size,0);
iterator new_avail=uninitialized_copy(data,avail,new_data);
//return the old space
uncreate();
//reset pointers to point to the newly allocate space
data=new_data;
avail=new_avail;
limit=data+new_size;
}
template <class T> void Vec<T>::unchecked_append(const T& val)
{
alloc.construct(avail++,val);
}
int main()
{
Vec<int> v;
for(Vec<int>::size_type i=0;i<10;++i)
v.push_back(i+1);
for(i=0;i<v.size();++i)
cout<<v[i]<<endl;
Vec<int> u(v);
// Vec<int> u(10,5);
// Vec<int> u=v;
for(i=0;i<u.size();++i)
cout<<u[i]<<string(3,' ');
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -