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的简易实现的更多相关文章

  1. 现代C++之理解decltype

     现代C++之理解decltype decltype用于生成变量名或者表达式的类型,其生成的结果有的是显而易见的,可以预测的,容易理解,有些则不容易理解.大多数情况下,与使用模板和auto时进行的类型 ...

  2. plist解析, 简易实现.

    源码 class Xml { public: typedef std::pair<std::wstring, std::wstring> NodeT; static std::vector ...

  3. 基于Win32 SDK实现的一个简易线程池

    利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...

  4. STL—vector

    前面介绍了STL对象的构造与析构以及内存的配置与释放,那具体的容器是怎么应用STL的空间配置器的呢?这篇先介绍STL的容器vector. vector的数据成员 vector只有4个数据成员:3个迭代 ...

  5. STL—vector空间的动态增长

    vector空间的动态增长     当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间.vect ...

  6. Opencv探索之路(二十):制作一个简易手动图像配准工具

    近日在做基于sift特征点的图像配准时遇到匹配失败的情况,失败的原因在于两幅图像分辨率相差有点大,而且这两幅图是不同时间段的同一场景的图片,所以基于sift点的匹配已经找不到匹配点了.然后老师叫我尝试 ...

  7. DirectX11 With Windows SDK--13 动手实现一个简易Effects框架、阴影效果绘制

    前言 到现在为止,所有的教程项目都没有使用Effects11框架类来管理资源.因为在D3DCompile API (#47)版本中,如果你尝试编译fx_5_0的效果文件,会收到这样的警告: X4717 ...

  8. 简易版AC自动机

    为什么说是简易版? 因为复杂度大概是\(O(M*\overline N)\),而似乎还有另一种大概是\(O(M+\sum N)\)的. 不过据说比赛不会卡前一种做法,因为模式串一般不会很长. 那么步入 ...

  9. 基于OpenGL编写一个简易的2D渲染框架-06 编写一个粒子系统

    在这篇文章中,我将详细说明如何编写一个简易的粒子系统. 粒子系统可以模拟许多效果,下图便是这次的粒子系统的显示效果.为了方便演示,就弄成了一个动图. 图中,同时显示了 7 种不同粒子效果,看上去效果挺 ...

随机推荐

  1. Programming In Scala笔记-第六章、函数式对象

    这一章主要是以定义和完善一个有理数类Rational为线索,分析和介绍有关类定义,构造函数,方法重写,变量定义和私有化,以及对操作符的定义等. 一.Rational类定义和构造函数 1.定义一个空类 ...

  2. [boost] Windows下编译

    编译命令 32位 编译 bjam variant=release link=static threading=multi runtime-link=static -a -q bjam variant= ...

  3. ROSCon 2016视频和幻灯片发布 ROS机器人操作系统重要参考资料

    ROSCon 2016视频和幻灯片发布 By Tully Foote on 十月19,2016 7:28 AM 全部PPT下载地址:http://pan.baidu.com/s/1gf2sn2F RO ...

  4. (Java)微信之个人公众账号开发(一)——进入开发者模式

    本篇文章将教大家如何建立微信个人公众账号,(注意:后台全部是用javaweb相关技术开发),大家知道,现在微信公众账号分服务号和订阅号,现在我要讲的主要是个人微信公众账号的建立以及后台的开发,个人公众 ...

  5. android view事件分发机制

    首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志 ...

  6. Android View框架总结(三)View工作原理

    转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52180375 测量/布局/绘制顺序 如何引起View的测量/布局/绘制? Perfor ...

  7. android 关机充电流程

    点击打开链接 0.主要流程 usb插入通过传递cmdline给init解析从而启动充电进程 1. LK lk\app\aboot\aboot.c update_cmdline ---------- i ...

  8. (一一五)利用NSKeyedArchiver实现任意对象转为二进制

    [应用背景] 在数据库中存储数据时,如果对象过于复杂,又不必要创建复杂的表,可以直接把整个对象转化为二进制存入数据库字段,然后取出后再还原即可. [实现方法] 在PHP中,使用序列化和反序列化可以实现 ...

  9. hadoop cdh5的pig隐式转化(int到betyarray)不行了

    cdh3上,pig支持int到chararray的隐式转化,但到cdh5不行. pig code is as follows: %default Cleaned_Log /user/usergroup ...

  10. java设计模式---职责链模式

    职责链的本质:分离职责,动态组合 样例: /** * 定义职责对象的接口 * */ public abstract class Handler { protected Handler successo ...