向量

向量结构的C++实现

 

/* * Vector * * Created on: 2011-5-24 * Author: sjiang2142 */ template<typename Object> class Vector { public: //构造函数 explicit Vector(int initSize=0):theSize(initSize),theCapacity(initSize+SPARE_CAPACITY) { objects = new Object[theCapacity]; } //复制构造函数 Vector(const Vector& rhs) { operator=(rhs);//调用operator= } //析构函数,释放内存 ~Vector() { delete[] objects; } //重载=运算符 const Vector& operator=(const Vector& rhs) { if(this!=&rhs)//如果不是指向同一块内存块 { delete[] objects;//删除本对象原始内存 theSize = rhs.size();//重新分配逻辑大小 theCapacity = rhs.theCapacity;//重新分配实际大小 objects = new Object[capacity()];//使用新的实际大小开辟一块内存 //将被复制的向量的数据拷贝到本向量数据中 for(int k=0;k<size();k++) { objects[k]=rhs.objects[k]; } } return *this;//返回复制后的向量引用 } //更改向量大小 void resize(int newSize) { if(newSize>theCapacity) { reserve(newSize*2+1);//改变实际大小并进行内存拷贝 } theSize = newSize;//改变逻辑大小 } //更改向量存储大小 void reserve(int newCapacity) { if(newCapacity<theSize) { return; } Object* oldArray=objects;//保存旧对象的指针 objects = new Object[newCapacity];//使用新大小开辟一块内存 //进行内存拷贝 for(int k=0;k<theSize;k++) { objects[k]=oldArray[k]; } theCapacity = newCapacity;//将新的实际大小赋值给保存实际大小的变量 delete[] oldArray;//删除旧的内存 } //重载[]运算符,输入一个索引,返回对象引用 Object& operator[](int index) { return objects[index]; } //返回的对象引用不可变 const Object& operator[](int index)const { return objects[index]; } //判断向量是否为空 bool empty()const { return size()==0; } //使用const,方法内的变量不能出现在赋值语句的左边 //返回向量大小 int size()const { return theSize; } //返回向量容量 int capacity()const { return theCapacity; } //在向量末尾插入一条数据 void push_back(const Object& x) { if(theSize==theCapacity) { reserve(2*theCapacity+1); } objects[theSize++]=x; } //向量末尾删除一条数据 void pop_back() { theSize--; } //返回最后一条数据 const Object& back()const { return objects[theSize-1]; } //定义迭代器 typedef Object* iterator; typedef const Object* const_iterator; //返回第一个元素的地址 iterator begin() { return &objects[0]; } const_iterator begin()const { return &objects[0]; } //返回最后一个元素的地址 iterator end() { return &objects[size()]; } const_iterator end()const { return &objects[size()]; } //实际大小比逻辑大小大16个单位 enum{SPARE_CAPACITY=16}; private: int theSize;//向量的大小,逻辑大小,数据数量 int theCapacity;//向量的容量,实际的大小,内存大小 Object* objects;//向量的数据 };

测试代码

//============================================================================ // Name : DT.cpp // Author : SJ // Version : // Copyright : Your copyright notice //============================================================================ #include <iostream> #include "Vector.h" using namespace std; int main() { Vector<int> vector;//创建一个向量对象 //插入三条数据 vector.push_back(1); vector.push_back(2); vector.push_back(3); vector.pop_back();//弹出最后一条数据 cout<<"vector.empty()="<<vector.empty()<<endl;//输出向量是否为空 cout<<"vector.size()="<<vector.size()<<endl;//输出数据大小 cout<<"vector.capacity()="<<vector.capacity()<<endl;//输出内存大小 cout<<"vector[0]="<<vector[0]<<endl;//输出第一个元素 Vector<int>::iterator iter = vector.begin();//创建迭代器 int i=0;//迭代计数变量 //迭代输出向量值 while(iter!=vector.end()) { cout<<"vector["<<i<<"]="<<*iter++<<endl; i++; } cout<<"vector.back()="<<vector.back()<<endl;//输出最后一个数据的值 Vector<int> newVector(vector);//复制构造函数 //Vector<int> newVector=vector;//复制构造函数 cout<<endl;//输出向量是否为空 cout<<"newVector.empty()="<<newVector.empty()<<endl;//输出向量是否为空 cout<<"newVector.size()="<<newVector.size()<<endl;//输出数据大小 cout<<"newVector.capacity()="<<newVector.capacity()<<endl;//输出内存大小 Vector<int>::iterator newIter = newVector.begin();//创建迭代器 int j=0;//迭代计数变量 //迭代输出向量值 while(newIter!=newVector.end()) { cout<<"newVector["<<j<<"]="<<*newIter++<<endl; j++; } cout<<"newVector.back()="<<newVector.back()<<endl;//输出最后一个数据的值 return 0; }

运行结果

vector.empty()=0
vector.size()=2
vector.capacity()=16
vector[0]=1
vector[0]=1
vector[1]=2
vector.back()=2

newVector.empty()=0
newVector.size()=2
newVector.capacity()=16
newVector[0]=1
newVector[1]=2
newVector.back()=2

你可能感兴趣的:(向量)