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