C++实现一个简单的动态数组

C++实现一个简单的动态数组

/**---------------------------------------
* 文件名称: CDynamicArray.h
* 功能描述: 实现数组函数
* 创建标识: xad 2022/2/8
*
* 修改标识:
* 修改描述:
------------------------------------------**/

#ifndef CDYNAMICARRAY_AYNAMICARRAY_H
#define CDYNAMICARRAY_AYNAMICARRAY_H

#include <iostream>
#include <string>

class CDynamicArray
{
private:
	int*	_pArr;			//存储动态数组的对象
	int		_nSize;			//数组元素的个数
	int		_nCapacity;		//数组容量

public:
	CDynamicArray();
	~CDynamicArray();
	/**
	*  @brief    添加元素
	*
	*  @param    int value
	*  @return   void
	*/
	void push_back_array(int value);

	void insert_array(int pos, int value);

	/**
	*  @brief    移除某个位置元素
	*
	*  @param    int pos
	*  @return   void
	*/
	void remove_array_pos(int pos);

	/**
	*  @brief    删除数组中的值
	*
	*  @param    int value
	*  @return   void
	*/
	void remove_array_value(int value);

	/**
	*  @brief    查找元数位置
	*
	*  @param    int value
	*  @return   int
	*/
	int find_array(int value);

	/**
	*  @brief    清除数组
	*
	*  @param    void
	*  @return   void
	*/
	void clear_array(void);

	/**
	*  @brief    获取元素个数
	*
	*  @param    void
	*  @return   int
	*/
	int get_size(void);

	/**
	*  @brief    获取容量大小
	*
	*  @param    void
	*  @return   int
	*/
	int get_capacity(void);

	/**
	*  @brief    查找某个位置的元素
	*
	*  @param    int pos
	*  @return   int
	*/
	int at_array(int pos);

	/**
	*  @brief    查找某个位置的元素
	*
	*  @param    int pos
	*  @param    int & value
	*  @return   bool
	*/
	bool at_array(int pos, int &value);

	/**
	*  @brief    打印数组
	*
	*  @param    void
	*  @return   void
	*/
	void print_array(void);
};

#endif CDYNAMICARRAY_AYNAMICARRAY_H

#include "DynamicArray.h"

CDynamicArray::CDynamicArray()
{
	_pArr = nullptr;
	_nSize = 0;
	_nCapacity = 20;
	_pArr = new int[_nCapacity];
}

CDynamicArray::~CDynamicArray()
{
	if (_pArr != nullptr)
	{
		delete[] _pArr;
		_pArr = nullptr;
	}

	std::cout << "free DynaimcArray Object" << std::endl;
}

void CDynamicArray::push_back_array(int value)
{
	if (_pArr == nullptr)
	{
		return;
	}

	if (_nSize == _nCapacity)
	{
		_nCapacity = _nCapacity * 2;
		int* pNewArr = new int[_nCapacity];
		memcpy(pNewArr, _pArr, _nCapacity * sizeof(int));
		delete[] _pArr;
		_pArr = pNewArr;
		_pArr[_nSize++] = value;
	}
	else
	{
		_pArr[_nSize] = value;
		_nSize++;
	}
	
}

void CDynamicArray::insert_array(int pos, int value)
{
	if (_pArr == nullptr|| pos >_nSize || pos < 0)
	{
		return;
	}

	if (pos == _nSize && _nSize + 1 < _nCapacity)
	{
		push_back_array(value);
		return;
	}
	
	int i = _nSize;
	if (pos < _nSize && _nSize + 1 < _nCapacity)
	{
		for (; i > pos; i--)
		{
			_pArr[i] = _pArr[i - 1];
		}
		_pArr[i] = value;
		_nSize++;
	}
	else
	{
		int* newAddr = new int[_nCapacity * 2];
		memcpy(newAddr, _pArr, _nCapacity * sizeof(int));
		delete[] _pArr;
		_pArr = newAddr;
		_nCapacity = _nCapacity * 2;
		for (; i > pos; i--)
		{
			_pArr[i] = _pArr[i - 1];
		}
		_pArr[i] = value;
		_nSize++;

	}

}

void CDynamicArray::remove_array_pos(int pos)
{
	if (_pArr == nullptr)
	{
		return;
	}

	if (pos < 0 || pos >= _nSize)
	{
		return;
	}

	for (int i = pos; i < _nSize - 1; i++)
	{
		_pArr[i] = _pArr[i + 1];
	}

	_nSize--;
}

void CDynamicArray::remove_array_value(int value)
{
	if ( _pArr ==  nullptr)
	{
		return;
	}

	int pos = find_array(value);
	remove_array_pos(pos);
}

int CDynamicArray::find_array(int value)
{
	if (_pArr == nullptr)
	{
		return -1;
	}

	int pos = -1;
	for (int i = 0; i < _nSize; i++)
	{
		if (_pArr[i] == value)
		{
			pos = i;
			break;
		}
			
	}

	return pos;
}

void CDynamicArray::clear_array(void)
{
	_nSize = 0;
}

int CDynamicArray::get_size(void)
{
	return _nSize;
}

int CDynamicArray::get_capacity(void)
{
	return _nCapacity;
}

int CDynamicArray::at_array(int pos)
{
	return _pArr[pos];
}

bool CDynamicArray::at_array(int pos, int & value)
{
	if (_pArr == nullptr || pos < 0 || pos >= _nSize|| pos >= _nCapacity)
	{
		return false;
	}

	value = _pArr[pos];
	return true;
}

void CDynamicArray::print_array(void)
{
	if (_pArr == nullptr)
	{
		return;
	}

	for (int i = 0; i < _nSize;i++)
	{
		std::cout << _pArr[i] << "  ";
	}
	std::cout << std::endl;
}

#include <iostream>
#include <vector>
#include "DynamicArray.h"

using namespace std;
void test_01(void);

int main()
{
	test_01();
	system("pause");
	return 0;
}

void test_01(void)
{
	CDynamicArray array;
	array.push_back_array(1);
	array.push_back_array(2); 
	array.push_back_array(31);
	array.push_back_array(4);
	array.push_back_array(5);
	array.push_back_array(6);
	array.push_back_array(8);
	array.print_array();

	std::cout << endl;
	std::cout << "at_array"<< array.at_array(3)<<"get_capacity:" << array.get_capacity() <<"get_size:"<< array.get_size();
	std::cout << std::endl;

	array.remove_array_pos(5);
	array.remove_array_pos(4);
	array.print_array();
	array.push_back_array(1);
	array.push_back_array(2);
	array.push_back_array(31);
	array.push_back_array(4);
	array.push_back_array(5);
	array.push_back_array(6);
	array.push_back_array(8);
	array.push_back_array(1);
	array.push_back_array(2);
	array.push_back_array(31);
	array.push_back_array(4);
	array.push_back_array(5);
	array.push_back_array(6);
	array.push_back_array(8);
	array.push_back_array(1);
	array.push_back_array(2);
	array.push_back_array(31);
	array.push_back_array(4);
	array.push_back_array(5);
	array.push_back_array(6);
	array.push_back_array(8);
	array.push_back_array(1);
	array.push_back_array(2);

	std::cout << "at_array" << array.at_array(3) << "get_capacity:" << array.get_capacity() << "get_size:" << array.get_size();
	int value = -1;
	int pos = 3;

	array.at_array(pos, value);
	std::cout << "at_array:"<< value << endl;

	array.clear_array();
	array.print_array();
	std::cout << "find_array:"<< array.find_array(4)<<std::endl;
	array.push_back_array(6);
	array.push_back_array(8);
	array.push_back_array(1);
	array.push_back_array(2);
	array.insert_array(3, 11);
	std::cout << "--------------" << endl;
	array.print_array();

	std::vector<int> VecArr;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值