实现一个简单的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. hdu2066一个人的旅行

    枚举全部相邻城市,作为起点,多次spfa,然后每次在想去的城市中找出spfa后的距离起点最短的花费时间 #include <iostream> #include <cstring&g ...

  2. 冒泡排序 JAVA版

    冒泡排序 算法思想是每次从数组末端开始比较相邻俩元素,把第i小的冒泡到数组的第i个位置.i从0一直到N-1从而完成排序.当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到第N-i个位置.I从0 ...

  3. Linux创建修改删除用户和组

    Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...

  4. 解决windows下的mysql匿名登陆无法使用mysql数据库的问题

    原文:解决windows下的mysql匿名登陆无法使用mysql数据库的问题 我在windows下安装了mysql,但是不用密码就能登进去,而root明明是有密码的,我用select user()命令 ...

  5. 读取USB HDD(USB移动硬盘信息)序列号的代码

    读取USB HDD(USB移动硬盘)序列号的代码,型号及分位. 使用Visual Studio 2010编译成功. 代码使用了CrystalDiskInfo中的代码smartata.c中相关代码: 例 ...

  6. Wix学习整理(1)——快速入门HelloWorld

    原文:Wix学习整理(1)--快速入门HelloWorld 1 Wix简介 Wix是Windows Installer XML的简称,其通过类XML文件格式来指定了用于创建Windows Instal ...

  7. HDOJ 2736 Surprising Strings

    Surprising Strings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. python列表和QVariant

    pyqt中.要给QAbstractTableModel的setData函数传递一个list參数: [20,'00:00:19'] 涉及到QVariant和list的转换. 能够使用QVariant类中 ...

  9. HTML与XML关系分析

    本来这篇是为CSS准备的,但看到视频中CSS和HTML.XML都有关系,即,都是设置他们的样式.而XML和HTML的格式看着也有些类似,就不得不分析一下二者之间的关系了. 要想分析事物关系,要先弄清他 ...

  10. JavaScript中的对象(一)

    Email:longsu2010 at yeah dot net 最近我和朋友谈起JavaScript中对象的问题.朋友以写JavaScript为生,而且生活的很好,然而我发现他并不真正懂这们语言的某 ...