#ifndef __MYVECTOR__
#define __MYVECTOR__
#include <Windows.h>
#define SUCCESS 1 // 成功
#define ERRORS -1 // 失败
#define MALLOC_ERROR -2 // 申请内存失败
#define INDEX_ERROR -3 // 错误的索引号
template<typename TELE>
class Vector
{
public:
Vector(void);
Vector(DWORD dwSize);
~Vector();
public:
DWORD at(DWORD dwIndex,OUT TELE* pEle); //根据给定的索引得到元素
DWORD push_back(TELE Element); //将元素存储到容器最后一个位置
VOID pop_back(); //删除最后一个元素
DWORD insert(DWORD dwIndex, TELE Element); //向指定位置新增一个元素
DWORD capacity(); //返回在不增容的情况下,还能存储多少元素
VOID clear(); //清空所有元素
BOOL empty(); //判断Vector是否为空 返回true时为空
DWORD erase(DWORD dwIndex); //删除指定元素
DWORD size(); //返回Vector元素数量的大小
private:
BOOL expand(); //容器满了需要扩充
private:
DWORD m_dwIndex; //下一个可用索引
DWORD m_dwIncrement; //每次增容的大小
DWORD m_dwLen; //当前容器可用的长度
DWORD m_dwInitSize; //默认初始化大小
TELE *m_pVector; //容器指针 };
template<typename TELE>
Vector<TELE>::Vector(void) //无参构造函数
:m_dwInitSize(),
m_dwIncrement(),
m_dwIndex()
{
m_pVector = new TELE[m_dwInitSize];
ZeroMemory(m_pVector,sizeof(TELE)*m_dwInitSize);
m_dwLen = m_dwInitSize;
}
template<typename TELE>
Vector<TELE>::Vector(DWORD dwSize) //有参构造函数
:m_dwInitSize(dwSize),
m_dwIndex(),
m_dwIncrement()
{
m_pVector = new TELE[m_dwInitSize];
ZeroMemory(m_pVector,sizeof(TELE)*m_dwInitSize);
m_dwLen = m_dwInitSize;
}
template<typename TELE>
Vector<TELE>::~Vector() //析构函数
{
if(m_pVector)delete [] m_pVector;
m_dwLen=NULL;
m_dwIncrement = NULL;
m_dwInitSize = NULL;
m_pVector = NULL;
m_dwIndex = NULL;
}
template<typename TELE>
DWORD Vector<TELE>::at(DWORD dwIndex,OUT TELE* pEle) //根据给定的索引得到元素
{
if(empty()||dwIndex >= m_dwIndex)
return INDEX_ERROR;
else
{
CopyMemory(pEle,&m_pVector[dwIndex],sizeof(TELE));
}
return SUCCESS;
}
template<typename TELE>
BOOL Vector<TELE>::expand() //容器满了需要扩充
{
//先申请内存空间用来存储新的数据
TELE* m_TempPtr = nullptr;
DWORD dw_NewInitSize = m_dwInitSize + m_dwIncrement;
m_TempPtr = new TELE[dw_NewInitSize];
if (!m_TempPtr)return false;
ZeroMemory(m_TempPtr,sizeof(TELE)*dw_NewInitSize);
CopyMemory(m_TempPtr,m_pVector,sizeof(TELE)*m_dwInitSize);
m_dwInitSize = dw_NewInitSize;
delete [] m_pVector; //释放原来的指针
m_pVector = m_TempPtr; //把新的指针给头指针
m_dwLen += m_dwIncrement;
return true;
}
template<typename TELE>
DWORD Vector<TELE>::push_back(TELE Element) //将元素存储到容器最后一个位置
{
//先判断容器是否满了
if(m_dwLen <= || m_dwIndex >= m_dwInitSize)
{
//需要扩充
if(!expand())
{
return ERRORS;
}
}
CopyMemory(&m_pVector[m_dwIndex],&Element,sizeof(TELE));
m_dwIndex++;
m_dwLen--;
return SUCCESS;
}
template<typename TELE>
VOID Vector<TELE>::pop_back() //删除最后一个元素
{
//先确定它是不是空的
if (empty())return;
ZeroMemory(&m_pVector[m_dwIndex-],sizeof(TELE));
m_dwIndex--;
m_dwLen++;
/*return SUCCESS;*/
}
template<typename TELE>
DWORD Vector<TELE>::insert(DWORD dwIndex, TELE Element) //向指定位置新增一个元素
{
//先判断给的索引是否可以插入
if (dwIndex < || dwIndex > m_dwIndex)
{
return INDEX_ERROR;
}
if(dwIndex == m_dwIndex)
{
CopyMemory(&m_pVector[m_dwIndex],&Element,sizeof(TELE));
return SUCCESS;
}
if(m_dwLen <= || m_dwIndex >= m_dwInitSize) //判断是否够插入新元素
{ //如果不够就要扩充
if(!expand())return ERRORS;
}
//0 1 2 3 4 5 6 7
//把要插入的索引的位置后面的元素后移
for(DWORD i = m_dwIndex;i>dwIndex;i--)
CopyMemory(&m_pVector[i],&m_pVector[i-],sizeof(TELE));
CopyMemory(&m_pVector[dwIndex],&Element,sizeof(TELE));
m_dwIndex++;
m_dwLen--;
return SUCCESS;
}
template<typename TELE>
DWORD Vector<TELE>::capacity() //返回在不增容的情况下,还能存储多少元素
{
return m_dwLen;
}
template<typename TELE>
VOID Vector<TELE>::clear() //清空所有元素
{
if(empty())return;
for (DWORD i =;i<m_dwIndex;i++)
ZeroMemory(&m_pVector[i],sizeof(TELE));
m_dwLen = NULL;
m_dwIndex = NULL;
m_dwInitSize = NULL;
m_dwIncrement = NULL;
}
template<typename TELE>
BOOL Vector<TELE>::empty() //判断Vector是否为空 返回true时为空
{
if(m_dwIndex)
return false;
else
return true;
}
template<typename TELE>
DWORD Vector<TELE>::erase(DWORD dwIndex) //删除指定元素
{
if(empty() || dwIndex < )return INDEX_ERROR; //
ZeroMemory(&m_pVector[dwIndex],sizeof(TELE));
for (DWORD i =dwIndex;i<m_dwIndex;i++) //把指定索引后面的元素向前移动即可
CopyMemory(&m_pVector[i],&m_pVector[i+],sizeof(TELE));
m_dwLen++;
m_dwIndex--;
return SUCCESS;
}
template<typename TELE>
DWORD Vector<TELE>::size() //返回Vector元素数量的数量
{
return (m_dwIndex-);
} #endif

vc++简单的vector动态数组实现的更多相关文章

  1. vc++基础班[28]---动态数组及动态链表的讲解

    C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray ...

  2. C++ vector动态数组

    #include<vector>头文件 vector类称作向量类 百度百科的解释:https://baike.baidu.com/item/vector/3330482 我喜欢把知识点拿出 ...

  3. C++向量 vector动态数组

    需要包含头文件, #include  <vector>    using namespace std; vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所 ...

  4. Vector(动态数组)怎么用咧↓↓↓

    定义方式:vector<int> a; //二维vector<int>a[100] 在末尾压入容器:a.push_back(x);//二维 a[i].push_back(x) ...

  5. vector动态数组

    vector是STL模板库中的序列式容器,利用它可以有效地避免空间的浪费. 创建vector容器 vector< int >v:vector< char >:vector< ...

  6. 八连通(vector动态数组法)

    题目和一般的八连通一样,但行数和列数未定,相乘对于1e6,直接开a[1e6][1e6]的数组肯定会爆内存.用二维的动态vector就能很好的解决这个问题 #include<bits/stdc++ ...

  7. C++ Vector 动态数组

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

  8. Delphi 的动态数组

    传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数.专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存. Delp ...

  9. vector:动态数组

    vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确.它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存 ...

随机推荐

  1. DDoS攻击新趋势:海量移动设备成为新一代肉鸡

    近期,阿里云安全团队观察到数十起大规模的应用层资源耗尽式DDoS攻击(应用层CC攻击).阿里云DDoS高防实现智能防护全程自动化检测并清洗,未对用户侧业务产生任何影响,这类攻击存在一些共同的特征,阿里 ...

  2. Vue.js 第5章 webpack配置

    为什么我们需要打包构建工具:因为我们以后做项目的时候,会使用到很多种不同的工具或者语言,这些工具或者语言其实浏览器并不支持 webpack 是一个现代 JavaScript 应用程序的模块打包器(mo ...

  3. 谷歌BERT预训练源码解析(三):训练过程

    目录前言源码解析主函数自定义模型遮蔽词预测下一句预测规范化数据集前言本部分介绍BERT训练过程,BERT模型训练过程是在自己的TPU上进行的,这部分我没做过研究所以不做深入探讨.BERT针对两个任务同 ...

  4. 解决 vs 出现Error MC3000 给定编码中的字符无效

    在 xaml 写中文注释,发现编译失败 Error MC3000 给定编码中的字符无效 我的 xaml 写了一句代码 <Grid> <!--林德熙--> </Grid&g ...

  5. Laravel5.5 支付宝手机网站支付的教程

    https://segmentfault.com/a/1190000015559571 这篇文章主要介绍了Laravel5.5 支付宝手机网站支付的教程,小编觉得挺不错的,现在分享给大家,也给大家做个 ...

  6. call,apply,bind详解

    为什么要改变this指向? 我们知道bind,call,apply的作用都是用来改变this指向的,那为什么要改变this指向呢?请看下面的例子: var name="lucy"; ...

  7. C#的类

    一.String类 1.Length 字符的长度 string x = Console.ReadLine();int i = x.Length;// Length 是获取字符串的长度(从1开始数)Co ...

  8. centos linux mysql 10060远程错误代码

    Navicat for MySQL远程连接数据错误代码10060 1.登陆远程linux服务器命令界面 vim /etc/sysconfig/iptables  进入防火墙配置修改 增加以下两条防火墙 ...

  9. H3C OSPF基本配置命令

  10. Chrome 里的请求报错 " Provisional headers are shown"

    之所以会出现这个警告,是因为去获取该资源的请求其实并(还)没有真的发生; 背景:提交表单,按钮点击<button>标签,触发事件,ajax发送请求,服务器返回信息; <button& ...