#include <iostream>
#include <memory>
using std::cout;
using std::endl;
using std::allocator;
template <typename T>
class Vector
{
public:
typedef T* iterator;
typedef const T * const_iterator;
Vector()
: _start(0)
, _finish(0)
, _end_of_storage(0)
{}
~Vector();
iterator begin(){ return _start; }
iterator end(){ return _finish; }
void push_back(const T & t);
void pop_back();
size_t size() const
{ return _finish - _start; }
size_t capacity() const
{ return _end_of_storage - _start; }
private:
void reallocate();
private:
static allocator<T> _alloc;
T * _start;
T * _finish;
T * _end_of_storage;
};
template <typename T>
allocator<T> Vector<T>::_alloc;
template <typename T>
Vector<T>::~Vector()
{
//销毁对象
while(_start != _finish)
_alloc.destroy(--_finish);
//回收开辟的空间
if(_start)
_alloc.deallocate(_start, capacity());
}
//动态数组的实现:
// 当当前元素的个数与能容纳元素的个数相等时,
//先开辟新的空间(原来的2倍),然后把原来空间的元素
//复制到新空间上,再回收原来的空间,最后在新开的空间上添加
//新的元素
template <typename T>
void Vector<T>::push_back(const T & t)
{
if(size() == capacity())
{
//动态扩容
reallocate();
}
//构造对象
_alloc.construct(_finish++, t);
}
template <typename T>
void Vector<T>::pop_back()
{
if(_start != _finish)
_alloc.destroy(--_finish);
}
template <typename T>
void Vector<T>::reallocate()
{
size_t oldCapacity = capacity();
size_t newCapacity = oldCapacity ? 2 * oldCapacity : 1;
T * tmp = _alloc.allocate(newCapacity);//申请是原始的内存
if(_start)
{
///memcpy();// 内置类型的数据
//copy();//调用对象的赋值运算符函数,意味着对象存在
std::uninitialized_copy(_start, _finish, tmp);//复制原来空间的数据
//回收原来空间的数据
while(_start != _finish)
_alloc.destroy(--_finish);
//回收原来空间
_alloc.deallocate(_start, oldCapacity);
}
_start = tmp;
_finish = _start + oldCapacity;
_end_of_storage = _start + newCapacity;
}
class Point
{
public:
Point(int ix = 0, int iy = 0)
: _ix(ix)
, _iy(iy)
{ cout << "Point(int=0,int=0)" << endl;}
Point(const Point & rhs)
: _ix(rhs._ix)
, _iy(rhs._iy)
{
cout << "Point(const Point &)" << endl;
}
~Point()
{ cout << "~Point()" << endl; }
friend std::ostream & operator<<(std::ostream & os, const Point & rhs);
private:
int _ix;
int _iy;
};
std::ostream & operator<<(std::ostream & os, const Point & rhs)
{
os << "(" << rhs._ix
<< "," << rhs._iy
<< ")";
return os;
}
template <typename Container>
void display(Container & c)
{
cout << "c's size = " << c.size() << endl
<< "c's capacity = " << c.capacity() << endl << endl;
#if 0
#endif
}
int main(void)
{
Vector<Point> points;
display(points);
points.push_back(Point(1, 2));
display(points);
points.push_back(Point(3, 4));
display(points);
points.push_back(Point(5, 6));
display(points);
#if 0
points.push_back(Point(1, 2));
display(points);
points.push_back(Point(1, 2));
display(points);
points.push_back(Point(1, 2));
display(points);
#endif
Vector<Point>::iterator it = points.begin();
while(it != points.end())
{
cout << *it << endl;
++it;
}
cout << endl;
return 0;
}