C++中动态数组实现

实现动态数组

  • 动态数组
  • 示例代码
    • 运行环境
    • 运行效果

动态数组

动态数组Vector可以动态扩展内存,其采用连续的内存空间,当内存空间不足,便以原来的容量的2倍或者1.5倍成倍的扩展,将原有的数组元素拷贝到新分配的内存空间中,释放原有的内存空间,新的元素将存入的新分配的内存空间。

示例代码

动态数组vector的size函数和capacity函数,分别作为求数组中现有的元素的个数和数组所能容纳的元素的个数。下面直接上实现的代码。
DynamicArray .h

#pragma onceclass DynamicArray {
public:DynamicArray();~DynamicArray();void push_back_Array(int value);void insertValueByPosArray(size_t pos,int value);void removeByValueFromArray(int value);void removeByPosFromArray(size_t pos);int findPosByValueArray(int value);int findValueByPosArray(size_t pos);void reclaimSpaceArray();void clearArray();int getCapacity();int getCount();void printArray();
private:int *m_pArr;size_t m_size;size_t m_capacity;
};

DynamicArray .cpp

#include "DynamicArray.h"
#include <iostream>using namespace std;
// DynamicArray.cpp DynamicArray::DynamicArray()
{m_size = 0;m_capacity = 20;m_pArr = new int[m_capacity];if (m_pArr == nullptr){cout << "new 开辟空间失败" << endl;}
}DynamicArray::~DynamicArray()
{if (m_pArr != nullptr) {delete[] m_pArr;m_pArr = nullptr;}m_size = 0;m_capacity = 0;
}void DynamicArray::push_back_Array(int value)//push_back
{if (m_pArr == nullptr){return;}reclaimSpaceArray();m_pArr[m_size] = value;m_size++;
}void DynamicArray::insertValueByPosArray(size_t pos, int value)//插入insert(可以在前,中,后插入)
{if (m_pArr == nullptr){return;}reclaimSpaceArray();for (size_t i = m_size - 1; i >= pos; --i)//pos为下标的数,从0开始{m_pArr[i + 1] = m_pArr[i];}m_pArr[pos] = value;m_size++;
}void DynamicArray::removeByValueFromArray(int value)
{if (m_pArr == nullptr){return;}int nPos = findPosByValueArray(value);removeByPosFromArray(nPos);
}void DynamicArray::removeByPosFromArray(size_t pos)//pos为下标的数,从0开始
{if (m_pArr == nullptr){return ;}if (pos < 0 || pos >= m_size)//pos的最大值为m_size-1{return ;}//找到被删除位置的下一位for (size_t i = pos + 1; i < m_size; ++i){m_pArr[i - 1] = m_pArr[i];}m_size--;
}int DynamicArray::findPosByValueArray(int value)
{size_t nPos = -1;if (m_pArr == nullptr){return nPos;}for (size_t i = 0; i < m_size; ++i){if (m_pArr[i] == value){nPos = i;break;}}return nPos;
}int DynamicArray::findValueByPosArray(size_t pos)
{if (m_pArr == nullptr){return -1;}if (pos < 0 || pos >= m_size){return -1;}return m_pArr[pos];
}void DynamicArray::reclaimSpaceArray()
{if (m_size == m_capacity){int *newArr = new int[m_capacity * 2];if (newArr == nullptr){cout << "new 开辟空间失败" << endl;return;}memset(newArr, 0, m_capacity * 2 * sizeof(int));//第三个参数为字节数memcpy(newArr, m_pArr, m_size * sizeof(int));//第三个参数为字节数//下面这种逐个赋值的方式也可以使用//for (size_t i = 0; i < m_capacity; i++)//{//	newArr[i] = m_pArr[i];//}m_capacity = m_capacity * 2;if (m_pArr) {delete[] m_pArr;m_pArr = nullptr;}m_pArr = newArr;}
}void DynamicArray::clearArray()//vector中clear()只是改变size的大小
{m_size = 0;
}int DynamicArray::getCapacity()
{return m_capacity;
}int DynamicArray::getCount()
{return m_size;
}void DynamicArray::printArray()
{for (size_t i = 0; i < m_size; ++i){//下面两种方式打印都可以cout << m_pArr[i] << " ";//int ret = findValueByPosArray(i);//cout<< ret<< " ";}cout << endl;
}

main.cpp

#include <iostream>
#include "DynamicArray.h"using namespace std;void test() {DynamicArray * pArray = new DynamicArray;int i = 0;while (i++ < 11) {pArray->push_back_Array(i);}pArray->printArray();cout <<"size= "<< pArray->getCount() << endl;cout << "容量: " << pArray->getCapacity() << endl;pArray->insertValueByPosArray(5,12);pArray->printArray();cout << "insert after size= " << pArray->getCount() << endl;cout << "insert after 容量: " << pArray->getCapacity() << endl;pArray->removeByValueFromArray(2);pArray->printArray();cout << "remove after size= " << pArray->getCount() << endl;cout << "remove after 容量: " << pArray->getCapacity() << endl;pArray->removeByPosFromArray(3);pArray->printArray();cout << "remove by pos after size= " << pArray->getCount() << endl;cout << "remove by pos after 容量: " << pArray->getCapacity() << endl;cout<<"find 2 of pos: "<<pArray->findPosByValueArray(2)<<endl;cout << "find 8 of pos: " << pArray->findPosByValueArray(8) << endl;cout << "value at pos of 6: " << pArray->findValueByPosArray(6) << endl;pArray->clearArray();cout << "size= " << pArray->getCount() << endl;cout << "容量: " << pArray->getCapacity() << endl;if (pArray){delete pArray;pArray = nullptr;}
}int main()
{test();return 0;
}

运行环境

以上代码的运行环境为:vs2017控制台输出程序。

运行效果

在这里插入图片描述
以上仅供记录。可帮助理解vector。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为面试改革,我们该怎么跟进?

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;近日&#xff0c;华为轮值董事长徐直军撰写了《关于公司高端精英类、软件类人才面试方…

使用GitHub

我们一直用GitHub作为免费的远程仓库&#xff0c;如果是个人的开源项目&#xff0c;放到GitHub上是完全没有问题的。其实GitHub还是一个开源协作社区&#xff0c;通过GitHub&#xff0c;既可以让别人参与你的开源项目&#xff0c;也可以参与别人的开源项目。 在GitHub出现以前…

C++中单链表的实现

单链表的实现单链表示例代码开发环境运行结果单链表 链表内存空间不一定连续&#xff0c;其扩展性较好。多余的不多说了。该文主要记录单链表的实现&#xff0c;该单链表含有一个非空的头节点。链表的操作实际上是对其指针域与数据域的操作。 示例代码 直接上代码&#xff1…

使用说明_预拌混凝土使用说明

尊敬的客户感谢您使用我公司的混凝土。为保证您的工程质量&#xff0c;我公司根据配制的混凝土性能&#xff0c;参与《预拌混凝土》GB/T14902-2003、混凝土施工有关标准以及工程施工过程中常见问题制定出本说明书和技术交底。敬请认真阅读并按本说明书和技术交底等规定的有关操…

【算法精讲】分享一道很不错的算法题

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;帅地转自&#xff1a;苦逼的码农分享一道leetcode上的题&#xff0c;…

C++中实现Stack

栈的实现栈示例代码开发环境运行结果栈 栈本着先进后出的原则&#xff0c;来存取数据。作为数据结构中的一种&#xff0c;这里不多介绍相关栈。仅以此文记录C中栈的实现&#xff0c;可帮助提升编程能力与对栈的理解。 示例代码 直接上代码。 SeqStack.h #pragma once#defin…

使用码云

使用GitHub时&#xff0c;国内的用户经常遇到的问题是访问速度太慢&#xff0c;有时候还会出现无法连接的情况&#xff08;原因你懂的&#xff09;。 如果我们希望体验Git飞一般的速度&#xff0c;可以使用国内的Git托管服务——码云&#xff08;gitee.com&#xff09;。 和G…

vstar为什么登录不了_一手的闲鱼号,为什么现在闲鱼号一号难求

现在随着闲鱼不断被众人发现是一个新的发财之地&#xff0c;之后便各种有关闲鱼项目的方案是层出不穷&#xff0c;比如闲鱼店群啊&#xff0c;那么一个人顶多只能够拥有几个闲鱼号&#xff0c;那么对于一些想要在闲鱼里面赚取一笔的人是远远不够的&#xff0c;那么自然也就造成…

游戏直播行业真的如你想象般暴利? | Alfred数据室

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;AlfredWu转自&#xff1a;Alfred数据室最近几年游戏直播行业火了&…

C++使用模板实现元素的反序

实现任意类型序列中元素的反序所涉知识点示例代码开发环境运行结果注意所涉知识点 阅读此文需要掌握的知识点&#xff1a;回调函数&#xff0c;模板类&#xff0c;类模板&#xff0c;栈。 示例代码 这里直接上代码。 #pragma once #include <Stack> using namespace …

Maven配置、使用

一、Maven安装与配置 1.1 下载maven安装包&#xff0c;解压即可使用 官网&#xff1a;http://maven.apache.org/download.cgi 1.2 配置maven环境变量 1.2.1 此电脑-【属性】-【高级系统设置】-【环境变量】-【建系统变量】 第一处&#xff1a;M_HOME 解压路径&#xff1a…

5G精华问答 | 5G的关键无线技术是啥?

5G的概念虽然很早就已经提出&#xff0c;但是对于大多数用户来说&#xff0c;真正听到并且对5G有了初步的了解还是在今年。今天就让我们来看看关于5G的精华问答吧。1Q&#xff1a;5G能干什么&#xff1f;A&#xff1a;5G将带来光纤般的“零”时延接入速率&#xff0c;同时将给网…

C++中实现链栈

链栈链栈简述示例代码开发环境运行结果注意链栈简述 链栈从概念上看是链表和栈的结合&#xff0c;含有栈先进后出的特性&#xff0c;也具有链表的动态增加节点的特性&#xff0c;这里相当于在链表的基础上增加只能从一端操作&#xff0c;且保持先进后出的特性。将头节点所在的…

Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案

相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码&#xff1a; 可以看到 userMapper 下有个红色警告。虽然代码本身并没有问题&#xff0c;能正常运行&#xff0c;但有个警告总归有点恶心。本文分析原因&#xff0c;并列出解决该警告的几种方案。 原因 众所周知&…

强封锁之后,华为正寻求10亿美元贷款;苹果发布iOS 12.3.1正式版,出击垃圾短信;联想CFO为“联想搬出中国”言论道歉;...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 中芯国际宣布从美国退…

python目前有多少库文件_必学Python库 你知道多少?

Tkinter———— Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块&#xff0c;Tkinter库提供了对Tk API的接口&#xff0c;它属于Tcl/Tk的GUI工具组。Tcl/Tk是由John Ousterhout发展的书写和图形设备。Tcl(工具命令语言)是个宏语言&#xff0c;用于简化shell下复…

C++中队列的顺序存储

队列引言示例开发环境运行结果引言 队列先进先出&#xff0c;队头出队&#xff0c;队尾入队&#xff0c;其存储可以分为顺序存储和链式储存。本文记录队列的顺序存储。也就是队列中的元素存储的内存空间是连续的&#xff0c;这里使用数组来模拟线性队列。 示例 直接上代码&a…

SpringBoot入门到精通_第1篇 _核心概念

SpringBoot 必知必会 核心精粹 文章目录一、SpringBoot必知必会1. 是什么&#xff1f;能做什么&#xff1f;2. 有哪些特性&#xff1f;一、SpringBoot必知必会 1. 是什么&#xff1f;能做什么&#xff1f; 是什么&#xff1f;能做什么&#xff1f; 是一个快速开发的脚手架 作…

全球再迎超级飓风,黑客可利用微软“蠕虫级”高危漏洞暴击全球

戳蓝字“CSDN云计算”关注我们哦&#xff01;WannaCry 余威未散&#xff0c;一场新的全球性“安全浩劫”接踵而来。“WannaCry”勒索病毒爆发刚满两年&#xff0c;Windows再次被曝出一个“蠕虫级”的高危远程漏洞CVE-2019-0708。攻击者一旦成功利用该漏洞&#xff0c;便可以在目…

.net redis定时_一场由fork引发的超时,让我们重新探讨Redis的抖动问题

​​​​​​​​​​​​​​​​​​​​​​​​​​​​摘要&#xff1a;一次由fork引发的时延抖动问题。背景介绍华为云数据库GaussDB(for Redis) 是一款基于计算存储分离架构&#xff0c;兼容Redis生态的云原生NoSQL数据库&#xff1b;它依靠共享存储池实现了强一致&…