实现一个简单的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 ;
}

输出:

  

线性表实现简单vector的更多相关文章

  1. 使用类模板的C++线性表实现(数组方式)

    main.h #ifndef _MAIN_H_ #define _MAIN_H_ #include <iostream> #include <exception> #inclu ...

  2. 图论——图的邻接表实现——Java语言(完整demo)

    1.图的简单实现方法——邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法. 对于每条边(u,v),置A[u,v]等于true:否则 ...

  3. 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:

    移动前端工作的那些事---前端制作之微信小技巧篇   (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...

  4. hibernate之关于使用连接表实现多对一关联映射

    [Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...

  5. DataStructure-链表实现指数非递减一元多项式的求和

    // 2-链表实现多项式的求和.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> #inclu ...

  6. 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)

    行逻辑链接,带行链接信息.程序有空指针BUG,至今未解决.还是C/C++适合描述算法数据结构.以后复杂的算法还是改用C/C++吧. 有BUG的代码,总有一天会换成没有BUG的. package 行逻辑 ...

  7. SpringSecurity结合数据库表实现权限认证

    SpringSecurity结合数据表实现权限认证: 下面的案例是在SpringBoot框架实现的: 步骤一:准备数据库表 以下是五张表的脚本 ### 用户表 create table Sys_Use ...

  8. bootstrap table 父子表实现【无限级】菜单管理功能

    bootstrap table 父子表实现[无限级]菜单管理功能 实现效果 前端代码 <%@ page language="java" import="java.u ...

  9. 【线性表基础】基于线性表的简单算法【Java版】

    本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeR ...

随机推荐

  1. CodeForces 13E. Holes 分块处理

    正解是动态树,太难了,仅仅好分块处理水之.看了看status大概慢了一倍之多..     分块算法大体就是在找一个折衷点,使得查询和改动的时间复杂度都不算太高,均为o(sqrt(n)),所以总的时间复 ...

  2. 得到一个临时的文件名称(使用GetTempFileName API函数)

    function GetExePath: string; begin Result := ExtractFilePath(ParamStr()); end; function GetTempFileN ...

  3. 利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)

    利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)作者:Tuuzed(土仔)   发表于:2008年3月3日23:12:38 版权声明:可以任意转载,转载时请 ...

  4. [Android学习笔记]some tips

    集合合并去重: listA.removeAll(listB); listA.addAll(listB); android:singleLine="true"//单行显示 andro ...

  5. latex表格线的颜色设置(边框添加颜色)

    添加了如下包:边框颜色要用到booktabs, colortbl, 包,下面代码里有一个自定义的颜色tabcolor \usepackage{ctexcap} \usepackage{graphicx ...

  6. Java 建立mysql数据库连接的语句

    每次在面试时被问到jdbc的数据路链接过程都卡着,这次不怕了,背会了... 第一个,比较粗糙的 try{   Class.forName("com.mysql.jdbc.Driver&quo ...

  7. [置顶] github简单使用

    git的介绍可以看这里   http://zh.wikipedia.org/wiki/GitHub 安装和使用参考的这个    http://www.cnblogs.com/cocowool/arch ...

  8. SPARK如何使用AKKA实现进程、节点通信

    SPARK如何使用AKKA实现进程.节点通信 <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 < ...

  9. SE 2014年5月9日

    两企业接入到 Internet(A公司和B公司),企业内部的用户及服务器均能够访问到 Internet. 2. A公司规模较大,采用了接入层/汇聚层/核心层的划分模式,接入层划分了多vLan(如图), ...

  10. linux编程进阶书推荐APUE,UNP

    编程进阶这里强烈推荐<unix环境高级编程>(简称APUE)和<unix网络编程>(简称UNP),这两本书可是经典中的经典啊,作 者是大名鼎鼎的 W.Richard Steve ...