#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. C++ 求向量的交集、并集、差集

    #include<iostream> #include<stdio.h> #include<list> #include<algorithm> //se ...

  2. @loj - 2434@ 「ZJOI2018」历史

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的 ...

  3. 洛谷P1546 最短网络 Agri-Net(Prim堆优化)

    #include<bits/stdc++.h> using namespace std; ; const int INF=0x3f3f3f3f; inline void read(int ...

  4. oracle函数 RTRIM(c1,[,c2])

    [功能]删除右边出现的字符串 [参数]C1 字符串 c2 追加字符串,默认为空格 [返回]字符型 [示例] SQL> select RTRIM('gao qian jingXXXX','X') ...

  5. python selenium 获取对象输入的属性值

    .get_attribute("value") from selenium import webdriver import time driver=webdriver.Firefo ...

  6. 原生js实现选字游戏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. scala资料总结,一些小技巧

    scala资料总结,一些小技巧 1.得到每种数据类型所表示的范围 Short.MaxValue 32767 Short.MinValue -32768 Int.MaxValue 2147483647 ...

  8. [转]Spring历史版本变迁和如今的生态帝国

    前两篇: 为什么要有Spring? 为什么要有Spring AOP? 前两篇从Web开发史的角度介绍了我们在开发的时候遇到的一个个坑,然后一步步衍生出Spring Ioc和Spring AOP的概念雏 ...

  9. 2018-8-10-git-提交添加-emoij-文字

    title author date CreateTime categories git 提交添加 emoij 文字 lindexi 2018-08-10 19:16:52 +0800 2018-2-1 ...

  10. 模板——Treap实现名次树

    Treap 是一种通过赋予结点随机权值的一种满足堆性质的二叉搜索树,它很好的解决了二叉搜索树顺序插入组成链式的局限性. 名次树是指在treap的每个结点中添加附加域size,表示以它为根的子树的总结点 ...