C++中动态数组实现

2023-11-13

动态数组

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

示例代码

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

#pragma once

class 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中动态数组实现 的相关文章

  • 有没有办法为向量采用内存资源?

    我已经开始在我的项目中使用 pmr allocators 并且我已经看到使用它们带来了很多性能提升和优势 我使用的分配器与我在下面的简单示例中展示的非常相似 include
  • 哪些 iomanip 操纵器具有“粘性”?

    我最近在创建一个stringstream由于我错误地假设std setw 会影响每次插入的字符串流 直到我明确更改它 然而 插入后它总是被取消设置 With timestruct with value of Oct 7 9 04 AM st
  • 请求的资源不支持 HTTP 方法“GET”

    我的路线配置正确 并且我的方法具有装饰标签 我仍然收到 请求的资源不支持 HTTP 方法 GET 消息 System Web Mvc AcceptVerbs GET POST System Web Mvc HttpGet public st
  • 到底什么是“位填充”或“填充位”?

    我只是在互联网上找不到任何关于 位填充 真正含义的详细解释 并且在 Stack Overflow 上也没有找到与位填充相关的线程的任何答案 我还搜索了 ISO 9899 1990 其中提到了 位填充 但没有根据我的需要进行解释 我在网上找到
  • 如何在函数中将结构成员作为指针传递?

    问题是我有一个结构是另一个 主要 结构的成员 我编写了一个函数来清除第一个结构 它需要一个指向结构的指针 我想使用该函数来清除主要结构内的结构 但我不确切知道哪种方法是正确的 为了更好地解释它 这里有一些代码 我有一个结构 定义为 type
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • 将 Visual Studio 2012 C++ 单元测试项目链接到 exe 会导致访问冲突

    我从现有的整体 exe 本机 Visual Studio 2012 项目开始 我想添加一个本机单元测试项目 根据http msdn microsoft com en us library hh419385 aspx objectRef ht
  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • string.empty 和 string[0] == '\0' 之间的区别

    假设我们有一个字符串 std string str some value is assigned 有什么区别str empty and str 0 0 C 11 及更高版本 string variable 0 如果字符串为空 则需要返回空字
  • 混合 VS2012 平台工具集

    我们正在从 VS2005 切换到 VS2012 update 2 我们正在构建大量 主要是控制台 本机 C 无 MFC ATL 可执行文件 它们使用几个常见的静态链接库 这些可执行文件主要在 Win7 计算机上运行 但有些也部署在较旧的 X
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • CS0246 找不到类型或命名空间名称“ErrorViewModel”(您是否缺少 using 指令或程序集引用?)

    我收到 CS0246 错误代码 我正在做一个 MVC net core 项目 我正在将 Razor 合并到我的 C 代码中 我在进行构建时收到此错误 我在最后一行收到错误 有人能帮我解决这个问题吗 global Microsoft AspN
  • 如何定义 Swagger UI 参数的默认值?

    我已将 Swagger Swashbuckle 集成到 NET Core 2 2 API 项目中 一切都很好 我的要求纯粹是为了方便 考虑以下 API 方法 public Model SomeEstimate SomeRequest req
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 正则表达式基于组的不同替换?

    所以我对正则表达式比较陌生 并且做了一些练习 我正在玩一个简单的 混淆器 它只是寻找 dot or dot or at or at 不区分大小写 并且在匹配项之前或之后有或没有任意数量的空格 这是针对通常情况的 someemail AT d
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 任何浮点密集型代码是否会在任何基于 x86 的架构中产生位精确的结果?

    我想知道使用浮点运算的 C 或 C 代码是否会在任何基于 x86 的体系结构中产生位精确的结果 无论代码的复杂性如何 据我所知 自 Intel 8087 以来的任何 x86 架构都使用准备处理 IEEE 754 浮点数的 FPU 单元 并且
  • 从哪里开始阅读 SQLite 源代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想了解sqlite是如何实现的 并且 想阅读源代码 我已经下载了源代码 我应该开始查看代码的哪一部分 SQLite文档页 http
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind

随机推荐

  • 如何用手机做兼职赚钱?教你利用闲鱼赚取生活费!

    众所周知 越来越多的人光靠朝九晚五的工作薪资 已经远远满足不了生活需求 所以越来越多的人在找一些靠谱的兼职去提高收入 不过网络上的兼职多种多样 有些人通过兼职挣了些钱 而大部分人则被各种 套路 不仅没挣到钱 还被收了智商费 像网上流行的什么
  • Eclipse不能启动:JVM terminated. Exit code=-1

    JVM terminated Exit code 1 Dosgi requiredJavaVersion 1 5 Xms40m Xmx512m XX MaxPermSize 256M Djava class path D eclipse p
  • 你期待的Photoshop 2022中哪个功能吸引了你?

    万众瞩目的2022年已经到来 那些大软件的最新大版本也陆续走到我们的面前 看到很多人都在追捧的期待Photoshop 2022 你知道ta具体有哪些变化么 来看看吧 创意世界在 Photoshop 上运行 全世界数以百万计的设计师 摄影师和
  • Java入门(4)——常见的String方法

    考虑到API当中的解释 新手可能有点看不懂 我刚开始就是不太看得懂 最好的学习方法当然是是自己一个一个去试一遍 然后就可以加深印象 然后 这是我当初学习的时候用自己的大白话做的笔记 现在查阅的话我还是喜欢看自己做的这些笔记 如果我有什么理解
  • VS2022的简单设置

    一 创建一个C C 的VS新项目 1 单击右侧 创建新项目 2 语言选择 C 选择 所有平台 桌面 选择 windows桌面向导 最单击下一步 3 为项目取一个名字 放在合适的位置上 单击 创建 在弹出的窗口点击 空项目 最后单击完成 完成
  • DataX :文本文件 -> mysql 的使用及安装教程

    DataX安装环境准备 jdk1 6以上 python2 0 DataX安装 1 官网下载DataX https github com gkbattle13 DataX 点击Download下载地址 2 解压DataX tar zxvf d
  • typescript任意类型

    1 any类型 如果不声明类型 会自动设置为any类型 但是会失去TS类型检测的作用 let anys any str anys 123 anys anys true anys anys Symbol 123 2 unknown类型 let
  • Python 按照某列内容对两个DataFrame进行合并

    要将两个DataFrame进行合并 如data1 和 data2按照第一列的内容纵向合并为一个新的DataFrame 可以使用pandas库中的merge 方法 按照实际需求将how参数设置为 left right outer inner
  • react 三种通信方式

    react有三种通信方式 一 父传子 二 字传父 三 兄弟之间传值 一 父组件向子组件传值 父组件通过属性的方式传递参数 子组件通过props来接收父组件传递过来的参数 React中是单向数据流 数据只能从父组件通过属性的方式传给其子组件
  • VMware 安装CentOS7配置环境、安装虚拟机、选择cd/dvd的方式安装系统、系统安装引导界面、需要定制化的内容、配置磁盘分区、修改主机名、网络配置、修改windows的主机映射文件(host

    文章目录 想看远程终端工具Xshell Xftp传输工具 VMware 安装的点这里 1 CentOS 1 1安装虚拟机 1 2选择cd dvd的方式安装系统 1 3系统安装引导界面 1 4需要定制化的内容 1 4 1调整时间差 1 4 2
  • ES 配置文件 jvm配置

    elasticsearch yml 设置最大分片数 默认1000 cluster max shards per node 1000000 kibana 设置默认查询数量 深度分页问题 PUT movies settings index ma
  • JVM-垃圾回收机制

    JVM 垃圾回收机制 引言 1 什么是垃圾 2 为什么需要GC 3 Java中的垃圾回收 垃圾回收相关算法 垃圾判断算法 标记阶段 引用计数算法 标记阶段 可达性分析算法 垃圾清除算法 清除阶段 标记 清除算法 清除阶段 标记 整理算法 清
  • 视频会议直播和存储

    DVR的配置文件说明 dvr RTMP stream to file start to record to file when encoder publish reap flv according by specified dvr plan
  • 手把手搭建Python量化交易平台-3:jenkins安装详细过程,搭建机器自动运行平台

    概述 本文介绍利用jenkins搭建机器自动运行平台的步骤和效果 一 目的 搭建一个让机器自动 周期性或定制化的执行特定程序的平台 为后续的进一步的目标奠定基础 1 每天让机器自动下周当天的金融数据 2 每天让机器自动对数据进行分析 3 每
  • 双指针算法

    目录 一 双指针算法的概念 二 双指针算法的应用 1 拆分字符串中的单词 2 最长连续不重复子序列 题目 朴素算法 双指针算法 另类双指针算法 3 数组元素的目标和 题目 代码实现 4 判断子序列 题目 代码实现 一 双指针算法的概念 核心
  • 提升网速 网卡和驱动

    去某宝下单了 是网卡和驱动的问题 某宝说网卡和驱动是一个意思 以下是操作步骤 更新驱动程序后从联想官网下载本台电脑对应的驱动 下载可以识别自己主机编号的软件 主机信息识别工具 然后获取编号 然后下载自己的有线网卡
  • 使用VS2010编写Linux程序

    使用VS2010开发Linux程序的好处 编写和调试都很方便 甚至不用自己编写Makefile文件 系统直接就生成了 特别是对于一些不熟悉Linux环境以及gdb调试的同学来说 这个就相对来说容易上手多了 下面就来介绍下环境的搭建 环境 w
  • mac电脑前端环境配置【包含m1芯片】

    目录 一 nvm的安装 1 卸载已安装到全局的 node npm 2 nvm安装 安装命令 常用命令 可能的问题 二 Git环境 1 安装git 2 git ssh 配置 3 重新配置 重新配置 也要在Terminal终端进行 4 测试配置
  • windwos11降级,重装Windows10

    windwos11降级 重装Windows10 序言 硬件信息 前提说明 制作U盘启动盘 修改电脑bios配置 重装系统 U盘启动 注意事项 驱动问题 序言 电脑到手查看安装的是Windows11家庭版系统 在视觉上整体感受更加圆滑柔顺 但
  • C++中动态数组实现

    实现动态数组 动态数组 示例代码 运行环境 运行效果 动态数组 动态数组Vector可以动态扩展内存 其采用连续的内存空间 当内存空间不足 便以原来的容量的2倍或者1 5倍成倍的扩展 将原有的数组元素拷贝到新分配的内存空间中 释放原有的内存