实现一个简单的vector

  Vector基于数组实现,可以复制并且其占用的内存可以自动回收(通过析构函数),可以调整Vector的大小,以及容量(容量的改变是通过为基本数组分配一个新的内存块,然后复制旧的内存块到新块中,再释放旧块的内存)。在进行插入和删除操作时,需要位置标记,这里使用通用的迭代器(其实就是指针)。

  代码如下:

/*
* 用数组的方式实现线性表
*/
#include<iostream>
using namespace std; template <typename Object>
class Vector
{
private:
int theSize;
int theCapacity;
Object * objects; public:
//构造函数
explicit Vector(int initSize = ) : theSize(initSize), theCapacity(initSize + SPACE_CAPACITY) {
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[capacity()];
for (int i = ; i < size();++i)
{
objects[i] = rhs.objects[i];
}
}
return *this;
} //调整Vector的大小
void resize(int newSize)
{
if (newSize > theCapacity)
{
reverse(newSize * + );
}
theSize = newSize;
} //调整容量
void reverse(int newCapacity)
{
if (newCapacity < theSize)
return;
Object *oldArray = objects;
objects = new Object[newCapacity];
for (int i = ; i < size(); ++i)
{
objects[i] = oldArray[i];
}
theCapacity = newCapacity;
delete[] oldArray;
} //重载取元素操作符[]
Object & operator[](int index)
{
return objects[index];
} //重载取元素操作符[] 返回值为左值不可修改
Object & operator[](int index) const
{
return objects[index];
} //判断是否为空
bool empty()
{
return theSize == ;
} //获得Vector的大小
int size() const
{
return theSize;
} //获得theCapacity的大小
int capacity() const
{
return theCapacity;
} //在尾部插入元素
void push_back(const Object &x)
{
if (theSize == theCapacity)
{
reverse( * theCapacity + );
}
objects[theSize++] = x;
} //弹出尾部元素
void pop_back()
{
theSize--;
} //返回尾部元素
const Object &back() const
{
return objects[theSize - ];
} //使用指针定义迭代器
typedef Object * itreator;
typedef const Object * const_itreator; //获取开始的迭代器
itreator begin()
{
return &objects[];
} const_itreator begin() const
{
return &objects[];
} //获取结束的迭代器
itreator end()
{
return &objects[size()];
} const_itreator end() const
{
return &objects[size()];
}
enum { SPACE_CAPACITY = };
}; int main()
{
Vector<int> vec;
vec.push_back();
vec.push_back();
for (auto it = vec.begin(); it != vec.end();++it)
{
cout << *it << ' ';
}
return ;
}

输出:

  

最新文章

  1. div两栏等高布局
  2. Fortify
  3. BZOJ4428 : [Nwerc2015]Debugging调试
  4. 洛谷 P1546 最短网络 Agri-Net Label:Water最小生成树
  5. MRP生产计划模式在多品种小批量生产过程中遭遇挑战
  6. JavaScript基础知识整理
  7. PHP 开发 APP 接口 学习笔记与总结 - XML 方式封装通信接口
  8. 站在K2角度审视流程--任务的独占与释放
  9. Linux 命令 - mv: 移动或重命名文件
  10. MySQL的相关设置
  11. InstallShield Custom Dialog
  12. 如何获取HttpServletResponse里面的内容
  13. Mysql 查询性能优化
  14. 开源 免费 java CMS - FreeCMS1.5-系统配置
  15. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
  16. UltraISO PE(软碟通) V9.5.5.2960 官方中文版
  17. 【原创】Android AOP面向切面编程AspectJ
  18. 在Python工作环境中安装包命令后加上国内源速度*15
  19. 1207. [HNOI2004]打鼹鼠【线性DP】
  20. zookeeper基础知识

热门文章

  1. java定义和实现接口
  2. [SVN]创建本地的SVN仓库
  3. 温故知新-------jQuery层次选择器
  4. VSTO学习笔记(九)浅谈Excel内容比较
  5. Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单
  6. Terracotta收购Ehcache (转)
  7. Spark实践的阶段性总结
  8. 百度地图API相关点
  9. 在 window7 window8下公布webService注意问题
  10. VMware Player安装centos