#include "stdafx.h"
#include <iostream>
using namespace std;
//template 关键字后接模板形参表,表明这里定义的Vector是一个类模板,而不是一个类,
//Vector<int>才是一个类.函数模板也是一样,它们都只是一个"公式".
template < typename Object>
class Vector
{
public :
static const int SPARE_CAPACITY = 16;
//将构造函数声明为explicit ,是为了抑制由构造函数定义的隐式转换
/*
构造函数的初始化列表.关于构造函数的初始化列表, 有两个要点.第一, 即使列表为空, 没有初始化式,
构造函数也会先初始化每个成员再进入函数体, 这时初始化的规则与初始化变量相同,
由此得知第二个要点:如果类的成员本身是一个没有默认构造函数的类类型, 或者成员是const、引用类型,
这样的成员必须在构造函数初始化列表中进行初始化
*/
explicit Vector( int initSize = 0) :theSize(initSize), theCapacity(initSize + SPARE_CAPACITY)
{
//new返回一个指向Object类型数组的指针
objects = new Object[theCapacity];
}
Vector( const Vector& rhs) :objects(NULL)
{
operator=(rhs);
}
~Vector()
{
delete [] objects;
}
const Vector& operator=( const Vector& rhs)
{
if ( this != &rhs)
{
delete [] objects;
theSize = rhs.theSize;
theCapacity = rhs.theCapacity;
objects = new Object[theCapacity];
for ( int k = 0; k < theSize; k++)
{
objects[k] = rhs.objects[k];
}
}
return * this ;
}
/*
由于成员函数的定常性是(即函数名后是否有const关键字)是签名的一部分,
因此我们可以使用访问函数的operator[]版本返回const引用,而修改函数版本返回一般引用
*/
Object& operator[]( int index)
{
if (index < 0 || index >= theSize)
{
return objects[0];
}
cout << "--Object& operator[](int index)" <<endl;
return objects[index];
}
const Object& operator[]( int index) const
{
cout << "** const Object& operator[](int index)const" << endl;
return objects[index];
}
//检测是否需要扩容
void reserve()
{
reserve(theSize);
}
void reserve( int newSize)
{
if (theCapacity > newSize)
{
return ;
}
int newCapacity = theCapacity * 2 + 1;
Object* oldArr = objects;
objects = new Object[newCapacity];
for ( int k = 0; k < theSize; k++)
{
objects[k] = oldArr[k];
}
theCapacity = newCapacity;
delete [] oldArr;
}
int size() const
{
return theSize;
}
int capacity() const
{
return theCapacity;
}
bool empty() const
{
return theSize == 0;
}
void resize( int newSize)
{
reserve(newSize);
theSize = newSize;
theCapacity = newSize;
}
void push_back( const Object& obj)
{
reserve(); //检测容器大小
objects[theSize++] = obj;
}
void pop_back()
{
theSize--;
}
const Object & back() const
{
return objects[theSize - 1];
}
Object* begin()
{
return &objects[0];
}
Object* end()
{
return &objects[theSize];
}
const Object* end() const
{
return &objects[theSize];
}
void toString()
{
cout << "Vecot长度:" << size() << ",容量:" << capacity() << endl;
for ( int i = 0; i < theSize; i++)
{
cout << "objects[" << i << "]:" << objects[i] << endl;
}
}
typedef Object* iterator;
typedef const Object* const_iterator;
private :
int theSize;
int theCapacity;
Object* objects;
};
|