这篇文章主要为大家详细介绍了C++实现动态数组的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
动态数组
动态数组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];
/
沃梦达教程
本文标题为:C++详解如何实现动态数组
猜你喜欢
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- Easyx实现扫雷游戏 2023-02-06
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Qt计时器使用方法详解 2023-05-30
- C语言详解float类型在内存中的存储方式 2023-03-27
- ubuntu下C/C++获取剩余内存 2023-09-18
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言qsort()函数的使用方法详解 2023-04-26
