C++ Vector 简单实现 会用也要会写

我们知道,内存块的大小是不能改变的,因此数组的大小不能改变。但是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对象调用的成员函数。


若有错误,欢迎指正。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值