vector的简易实现
vector的简易实现整理自《数据结构与算法分析–C++描述(第3版)》3.4节“向量的实现”。详细可参考《STL源码分析》4.2节。
具体实现代码如下:
#ifndef VECTOR_H
#define VECTOR_H #include <iostream>
using namespace std; template<class T>
class Vector
{
private:
int theSize;
int theCapacity;
T *objects; public:
typedef T* iterator;
typedef const T* const_iterator;
enum{ SPARE_CAPACITY = }; public:
explicit Vector(int initSize = ); //用explicit避免隐式类型转换
~Vector();
Vector(const Vector<T>& rhs);
const Vector<T>& operator=(const Vector<T>& rhs); void resize(int newSize);
void reserve(int newCapacity); T& operator[](int index);
const T& operator[](int index) const; bool empty() const;
int size() const;
int capacity() const; void push_back(const T& x);
void pop_back();
const T& back() const; iterator begin();
const_iterator begin() const; iterator end();
const_iterator end() const; }; template<class T>
Vector<T>::Vector(int initSize = ) : theSize(initSize), theCapacity(initSize + SPARE_CAPACITY)
{
objects = new T[theCapacity];
} template<class T>
Vector<T>::~Vector()
{
delete []objects;
} template<class T>
Vector<T>::Vector(const Vector<T>& rhs) : objects(nullptr)
{
operator = (rhs);
} template<class T>
const Vector<T>& Vector<T>::operator=(const Vector<T>& rhs)
{
if (this != &rhs)
{
delete[]objects;
theSize = rhs.size();
theCapcity = rhs.theCapacity; // 注意是深拷贝
objects = new T[capacity()];
for (int k = ; k < size(); k++)
objects[k] = rhs.objects[k];
} return *this;
} template<class T>
void Vector<T>::resize(int newSize)
{
if (newSize > theCapacity)
reserve(newSize * + ); //每次空间不够的时候,就重新获得2倍于当前容量的空间,+1是为了防止0的情况
theSize = newSize;
} template<class T>
void Vector<T>::reserve(int newCapacity)
{
if (newCapacity < theSize)
return; T *oldArray = objects; // 之所以需要将老的数组复制到新的数组,是因为要保证Vector整块内存的连续性
objects = new T[newCapacity];
for (int k = ; k < theSize; k++)
objects[k] = oldArray[k]; theCapacity = newCapacity; delete []oldArray;
} template<class T>
T& Vector<T>::operator[](int index)
{
return objects[index];
} template<class T>
const T& Vector<T>::operator[](int index) const
{
return objects[index];
} template<class T>
bool Vector<T>::empty() const
{
return size() == ;
} template<class T>
int Vector<T>::size() const
{
return theSize;
} template<class T>
int Vector<T>::capacity() const
{
return theCapacity;
} template<class T>
void Vector<T>::push_back(const T& x)
{
if (theSize == theCapacity)
reserve(theCapacity * + );
objects[theSize++] = x;
} template<class T>
void Vector<T>::pop_back()
{
theSize--;
} template<class T>
const T& Vector<T>::back() const
{
return objects[theSize - ];
} template<class T>
T* Vector<T>::begin()
{
return &objects[];
} template<class T>
const T* Vector<T>::begin() const
{
return &objects[];
} template<class T>
T* Vector<T>::end()
{
return &objects[size() - ];
} template<class T>
const T* Vector<T>::end() const
{
return &objects[size() - ];
} #endif
vector的简易实现的更多相关文章
- 现代C++之理解decltype
现代C++之理解decltype decltype用于生成变量名或者表达式的类型,其生成的结果有的是显而易见的,可以预测的,容易理解,有些则不容易理解.大多数情况下,与使用模板和auto时进行的类型 ...
- plist解析, 简易实现.
源码 class Xml { public: typedef std::pair<std::wstring, std::wstring> NodeT; static std::vector ...
- 基于Win32 SDK实现的一个简易线程池
利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...
- STL—vector
前面介绍了STL对象的构造与析构以及内存的配置与释放,那具体的容器是怎么应用STL的空间配置器的呢?这篇先介绍STL的容器vector. vector的数据成员 vector只有4个数据成员:3个迭代 ...
- STL—vector空间的动态增长
vector空间的动态增长 当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间.vect ...
- Opencv探索之路(二十):制作一个简易手动图像配准工具
近日在做基于sift特征点的图像配准时遇到匹配失败的情况,失败的原因在于两幅图像分辨率相差有点大,而且这两幅图是不同时间段的同一场景的图片,所以基于sift点的匹配已经找不到匹配点了.然后老师叫我尝试 ...
- DirectX11 With Windows SDK--13 动手实现一个简易Effects框架、阴影效果绘制
前言 到现在为止,所有的教程项目都没有使用Effects11框架类来管理资源.因为在D3DCompile API (#47)版本中,如果你尝试编译fx_5_0的效果文件,会收到这样的警告: X4717 ...
- 简易版AC自动机
为什么说是简易版? 因为复杂度大概是\(O(M*\overline N)\),而似乎还有另一种大概是\(O(M+\sum N)\)的. 不过据说比赛不会卡前一种做法,因为模式串一般不会很长. 那么步入 ...
- 基于OpenGL编写一个简易的2D渲染框架-06 编写一个粒子系统
在这篇文章中,我将详细说明如何编写一个简易的粒子系统. 粒子系统可以模拟许多效果,下图便是这次的粒子系统的显示效果.为了方便演示,就弄成了一个动图. 图中,同时显示了 7 种不同粒子效果,看上去效果挺 ...
随机推荐
- Excel下拉框多列显示,如何只显示一列
小编最近接手一个项目,之于需要导数据,但是我们需要提前把表头什么的设置好,更方便其他小伙伴们帮助我们导入数据,小伙伴们都知道,在excel中设置下拉菜单很简单,直接用数据有效性-序列就可以实现,今天小 ...
- Java基本语法-----java变量
1.变量的概述 用于存储可变数据的容器. 2.变量存在的意义 计算机主要用于处理生活中的数据,由于生活中存在大量的可变数据,那么计算机就必须具备存储可变数据的能力. 比如: 1.时间每一秒都在发生变化 ...
- Eclipse打jar包,资源文件的读取
最近的工作中需要将java程序打一个jar包,然后在Linux中供调用.程序中需要读取一个配置文件.遇到了三个问题.第一个是依赖的第三方Jar包打成Jar包后找不到:第二个问题是资源文件所在的文件夹打 ...
- 第一行代码阅读笔记----显示隐式Intent的基本用法
1.显示Intent意图明显,通过Intent启动另外一个活动,这是安卓中各组件进行交互的一种重要方式.一般用于启动活动,启动服务,发送广播等场景. 实现方法,这里我只说思路,实践还是要自己实操才能明 ...
- 【Netty源码学习】ServerBootStrap
上一篇博客[Netty源码学习]BootStrap中我们介绍了客户端使用的启动服务,接下来我们介绍一下服务端使用的启动服务. 总体来说ServerBootStrap有两个主要功能: (1)调用父类Ab ...
- SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)
接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 Security ...
- Dynamics CRM2015 2015版本可用的OData Query Designer工具
2015后很多工具无法使用,包括2011版的OData Query Designer,这里介绍一款可用的工具,Dynamics XRM Tools for CRM 2015,下载地址:https:// ...
- Android之Gallery和Spinner-Android学习之旅(二十九)
Spinner简介 spinner是竖直方向展开一个列表供选择.和gallery都是继承了AbsSpinner,AbsSpinner继承了AdapterView,因此AdaptyerView的属性都可 ...
- 下载android4.4.2源码全过程(附已下载的源码)
今天在下载andriod源码,特来与大家分享一下我的经验.当然,网上教下载源码的教程较多,本文主要针对在GFW下下载源码出现的各种问题的解决方法. 1.首先安装下载客户端git , curl. 命令如 ...
- java 之容器
在Java中,我们想要保存对象可以使用很多种手段.我们之前了解过的数组就是其中之一.但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以 ...