我们知道,内存块的大小是不能改变的,因此数组的大小不能改变。但是STL的vector让我们摆脱了这种困扰,它可以帮我们动态的管理数组的大小。
诚然,STL的vector底层还是通过动态数组来实现的,当数组大小不够时,就申请一块更大的内存,同时将原来的元素的值拷贝过去,再删掉原来那块小内存,当然这一操作的带价是非常高的,包括了一次申请内存和释放内存,以及元素的初始化。(更多的一些注意问题可以查看之前的博文http://blog.csdn.net/u011408355/article/details/47060277)
本文给出了Vector类模板的实现,相比于STL的vector模板当然差的远了,但是大致原理差不多了,大家读读下面的代码应该可以让你对STL的vector的理解加深。
template<typename T>
class Vector{
public:
//构造函数,复制构造函数以及析构函数
Vector(int size=0):theSize(size),theCapacity(0+SPACE_CAPACITY){
objects=new T[theCapacity];
}
Vector(const Vector& rhs):objects(NULL){
operator=(rhs);
}
~Vector(){
delete[] objects;
}
// 重载=号操作符
const Vector& operator=(const Vector& rhs){
theCapacity=rhs.theCapacity;
theSize=rhs.theSize;
objects=new objects[this->theCapacity];
for(int i=0;i<this->theSize;i++)
objects[i]=rhs.objects[i];
return *this;
}
//调整size
void resize(int newSize){
if(newSize>theCapacity)
reserve(newSize*2+1);
theSize=newSize;
}
//调整预留的空间,也就是实际上申请的内存的大小
void reserve(int newCapacity){
if(newCapacity<theSize)
return;
T* oldObject=objects;
objects=new T[newCapacity];
theCapacity=newCapacity;
for(int i=0;i<theSize;i++)
objects[i]=oldObject[i];
delete objects;
}
//重载[]操作符
T& operator[](int index){
return *(objects+index);
}
const T& operator[](int index)const{
return *(objects+index);
}
//几个get函数,均为const成员,保证const对象也能调用
bool isEmpty() const{
return getSize()==0;
}
int capacity() const{
return theCapacity;
}
int size() const{
return theSize;
}
//push和pop操作
void push_back(T t){
if(theSize==theCapacity)
reserve(theCapacity*2+1);
objects[theSize++]=t;
}
void pop_back(){
theSize--;
}
T& back(){
return objects[theSize-1];
}
const T& back()const{
return objects[theSize-1];
}
// 迭代器
typedef T* iterater;
typedef const T* const_iterater;
//begin end 等操作
iterater begin(){
return objects;
}
const_iterater begin() const{
return objects;
}
iterater end(){
return (objects+theSize);
}
const_iterater end() const{
return (objects+theSize);
}
enum { SPACE_CAPACITY=16};
private:
T* objects;
int theSize;
int theCapacity;
};
这里稍微提一下 const成员函数,也称常成员函数,或者只读成员函数,const对象只能访问常成员函数,通过const指针调用也只能访问常成员函数,但是有个特例,构造函数和析构函数是唯一不是const成员函数却可以被const对象调用的成员函数。
若有错误,欢迎指正。