#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. PyODPS DataFrame 的代码在哪里跑

    在使用 PyODPS DataFrame 编写数据应用时,尽管编写的是同一个脚本文件,但其中的代码会在不同位置执行,这可能导致一些无法预期的问题,本文介绍当出现相关问题时,如何确定代码在何处执行,以及 ...

  2. 【[Offer收割]编程练习赛9 C】三等分

    [题目链接]:http://hihocoder.com/problemset/problem/1479 [题意] . [题解] 首先算出所有节点的权值的和val; 然后如果val%3!=0则直接输出0 ...

  3. 模板—e-dcc缩点

    int dfn[MAXN],low[MAXN],cnt; bool isbridge[MAXN]; void tarjan(int x,int edg) { low[x]=dfn[x]=++cnt; ...

  4. 「POI2012」约会 Rendezvous

    #2691. 「POI2012」约会 Rendezvous 这题我简直不想说什么了,什么素质,卡常数…… “每个顶点有且仅有一条出边”,所以是一道基环树的题,首先tarjan缩点,在缩完点后的图上求a ...

  5. LA 4119 Always an integer (数论+模拟)

    ACM-ICPC Live Archive 一道模拟题,题意是问一个给出的多项式代入正整数得到的值是否总是整数. 这题是一道数论题,其实对于这个式子,我们只要计算1~最高次项是否都满足即可. 做的时候 ...

  6. 随机线性网络编码的C语言实现,实现可靠传输:实现篇(2)

    伽罗华域(2^8)乘除法的编程实现

  7. H3C 总线型以太网拓扑扩展

  8. Talk is cheap. Show me the code.

    Talk is cheap. Show me the code. -- Linux创始人 Linus Torvalds 2000-08-25 Stay hungry Stay foolish -- 乔 ...

  9. eclipse本地启动tomcat报错集锦

    1.eclipse本地添加tomcat服务器    打开Eclipse,单击“window”菜单,选择下方的“Preferences”: 找到Server下方的Runtime Environment, ...

  10. Python--day32--复习:https和http的区别;黏包;黏包问题的解决方式;

    1,https和http的区别: https比较安全,传输的时候先对内容进行加密,收到后再进行解密:它的传输内容不容易拦截,就算拦截下来了,也是加密的,看不懂.但是要买证书,一年要好几万,小公司承担不 ...