vc++简单的vector动态数组实现
#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动态数组实现的更多相关文章
- vc++基础班[28]---动态数组及动态链表的讲解
C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray ...
- C++ vector动态数组
#include<vector>头文件 vector类称作向量类 百度百科的解释:https://baike.baidu.com/item/vector/3330482 我喜欢把知识点拿出 ...
- C++向量 vector动态数组
需要包含头文件, #include <vector> using namespace std; vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所 ...
- Vector(动态数组)怎么用咧↓↓↓
定义方式:vector<int> a; //二维vector<int>a[100] 在末尾压入容器:a.push_back(x);//二维 a[i].push_back(x) ...
- vector动态数组
vector是STL模板库中的序列式容器,利用它可以有效地避免空间的浪费. 创建vector容器 vector< int >v:vector< char >:vector< ...
- 八连通(vector动态数组法)
题目和一般的八连通一样,但行数和列数未定,相乘对于1e6,直接开a[1e6][1e6]的数组肯定会爆内存.用二维的动态vector就能很好的解决这个问题 #include<bits/stdc++ ...
- C++ Vector 动态数组
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
- Delphi 的动态数组
传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数.专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存. Delp ...
- vector:动态数组
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确.它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存 ...
随机推荐
- OpenKruise - 云原生应用自动化引擎正式开源
2019 年 6 月 24 日至 26 日, 由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 KubeCon + CloudNativeCo ...
- 1月北上广P2P平台之最 平台数成交量现双降
1月北上广P2P平台之最 平台数成交量现双降 今日(2月9日),网贷之家联合盈灿咨询发布了<北上广地区P2P网贷行业2017年1月月报>.月报数据显示,截至2017年1月底,北京.上海 ...
- Python深入:stevedore简介
stevedore是用来实现动态加载代码的开源模块.它是在OpenStack中用来加载插件的公共模块.可以独立于OpenStack而安装使用:https://pypi.python.org/pypi/ ...
- Python深入:02浅拷贝深拷贝
对象赋值实际上是简单的对象引用.也就是说当你创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 假设想创建一对小夫妻的通用档案,名为person. ...
- HZOJ 大佬(kat)
及其水水水的假期望(然而我已经被期望吓怕了……). 数据范围及其沙雕导致丢掉5分…… 因为其实每天的期望是一样的,考虑分开. f[i][j]表示做k道题,难度最大为j的概率. 则f[i][j]=(f[ ...
- poj 1039 Pipe (Geometry)
1039 -- Pipe 理解错题意一个晚上._(:з」∠)_ 题意很容易看懂,就是要求你求出从外面射进一根管子的射线,最远可以射到哪里. 正解的做法是,选择上点和下点各一个,然后对于每个折点位置竖直 ...
- 使用模块定义AngularJS组件
一.模块创建/查找 module 当创建一个模块时,必须指定name和requires参数,即使你的模块并不存在依赖 var myApp=angular.module("exampleApp ...
- H3C 数据链路层
- c++ 基本使用
1 枚举 enum ShapeType { circle, square, rectangle }; int main() { ShapeType shape = circle; switch(sha ...
- Codeforces3C. Tic-tac-toe 题解 状态压缩+搜索
作者:zifeiy 标签:状态压缩.搜索 题目链接:https://codeforces.com/contest/3/problem/C 题目大意: 有一个 \(3 \times 3\) 的棋盘,给你 ...