11
04/2014
C++自定义Vector模板
C++的vector函数,当数据量到达一定程度,清空时就会花费很多时间。打算自己写一个内存管理器,并写一个可变长的数组。下面是我的vector代码:
MyVector.h:
#ifndef __MY_VECTOR_H
#define __MY_VECTOR_H
#include <stdio.h>
#define SafeDelete(_x) { if (_x) { delete (_x); (_x) = NULL; } }
#define SafeDeleteArray(_x) { if (_x) { delete [] (_x); (_x) = NULL; } }
template <typename T>
class MyVector{
public:
//默认构造函数
MyVector(){
this->length=0;
this->maxlength=10;
this->data=new T[this->maxlength];
for (unsigned i=0;i<this->maxlength;i++)
{
this->data[i]=NULL;
}
};
//初始化长度
MyVector(unsigned initLength){
if (initLength<5)
{
printf("warning: vector init_length must more than 5.\n");
initLength=5;
}
this->length=0;
this->maxlength=initLength;
this->data=new T[this->maxlength];
for (unsigned i=0;i<this->maxlength;i++)
{
this->data[i]=NULL;
}
};
//拷贝构造函数
MyVector(const MyVector& v){
this->length=v.length;
this->maxlength=v.maxlength;
this->data=new T[this->maxlength];
for (unsigned i=0;i<this->maxlength;i++)
{
this->data[i]=v.data[i];
}
};
~MyVector(){
this->length=0;
this->maxlength=0;
SafeDeleteArray(this->data);
};
//插入一个元素到最后
void insert(T element){
if (this->length>=this->maxlength)
{
unsigned i;
T* dataTemp=new T[this->maxlength*2];
for (i=0;i<this->maxlength;i++)
{
dataTemp[i]=this->data[i];
}
this->maxlength=this->maxlength*2;
for (;i<this->maxlength;i++)
{
dataTemp[i]=NULL;
}
SafeDeleteArray(this->data);
this->data=dataTemp;
}
this->data[this->length]=element;
this->length++;
};
//清空vector
void clear(){
SafeDeleteArray(this->data);
this->length=0;
this->maxlength=10;
this->data=new T[this->maxlength];
for (unsigned i=0;i<this->maxlength;i++)
{
this->data[i]=NULL;
}
};
//获得下标为i的对象
T get(unsigned i){
if (i>=this->length)
{
return NULL;
}
return this->data[i];
};
//设置下标为i的对象,返回原来的对象
T set(unsigned i, T element){
if (i>=this->maxlength)
{
unsigned j;
T* dataTemp=new T[2*i];
for (j=0;j<this->maxlength;j++)
{
dataTemp[j]=this->data[j];
}
this->maxlength=2*i;
for (;j<this->maxlength;j++)
{
dataTemp[j]=NULL;
}
SafeDeleteArray(this->data);
this->data=dataTemp;
}
T olddata=this->data[i];
this->data[i]=element;
if (this->length<i+1)
{
this->length=i+1;
}
return olddata;
};
//获得vector元素个数
unsigned size(){
return this->length;
};
//重载[]操作符
T& operator[](unsigned i){
if (i>=this->length)
{
printf("error: vector is out of vector.\n");
exit(1);
}
return this->data[i];
};
//重载=操作符
MyVector& operator=(const MyVector & v){
this->length=v.length;
this->maxlength=v.maxlength;
SafeDeleteArray(this->data);
this->data=new T[this->maxlength];
for (unsigned i=0;i<this->maxlength;i++)
{
this->data[i]=v.data[i];
}
return *this;
};
private:
T* data; //存储数据的数组
unsigned length; //数组元素
unsigned maxlength; //最大可存储空间
};
#endifmain.cpp:
#include <stdio.h>
#include <stdlib.h>
#include "MyVector.h"
int main(){
MyVector<int> v1;
v1.insert(3);
MyVector<int> v2;
v2=v1;
printf("%d\n",v1[0]);
printf("%d\n",v2[0]);
system("PAUSE");
return 0;
}注意到模板类的写法,最好将类的成员函数在类声明时定义。否则可能会遇到一些编译错误。具体看http://blog.csdn.net/jfkidear/article/details/7888167
以上的MyVector是一个简单版本的。需要说明的一点是,若MyVector<int> v2=v1,调用的是拷贝构造函数。若MyVector<int> v2; v2=v1; 则调用的是=重载函数。因此,=操作符必须重写,拷贝构造函数要重写。
转载请注明:康瑞部落 » C++自定义Vector模板

0 条评论