C ++は動的可変長配列を実現します

       概要:配列MyArrayを自分でカプセル化し、いくつかのメソッドを追加し、動的な可変長配列に変更します(配列の容量は固定されていません。サイズ== capicityが見つかると、容量が2倍になり、サイズ== capicity / 4になると、容量が減少します2倍。サイズは配列の現在の要素数、容量は配列の最大容量です)

       ヘッダーファイル:

#pragma once
#ifndef MYARRAY
#define MYARRAY

class MyArray
{
public:
	MyArray(int a);
	virtual ~MyArray();
	bool isEmpty();
	int getSize();
	int getCapicity();
	void addLast(int a);
	void addfirst(int a);
	void add(int pos, int a);//在pos索引位置添加元素
	int removeData(int pos);//删除pos位置元素,返回该位置被删的值
	int getData(int pos);
	void printData();
private:
	int *data;
	int m_isize;//数组当前元素个数
	int m_icapicity;//数组容量
	void resize(int newCapicity);//实现动态变长数组,当size超过容量的时候不报错,而是调用该函数,改变容量
};
#endif

       ソースファイル:

#include "MyArray.h"
#include <iostream>
using namespace std;

MyArray::MyArray(int a)
{
	data = new int[a];
	m_icapicity = a;
	m_isize = 0;
}

MyArray::~MyArray()
{
	delete[]data;
	data = NULL;
}
bool MyArray::isEmpty() {
	return m_isize == 0;
}
int MyArray::getSize() {
	return m_isize;
}
int MyArray::getCapicity() {
	return m_icapicity;
}
void MyArray::addLast(int a) //在末尾添加元素
{
	if (m_isize == m_icapicity)
	{
		resize(m_icapicity *= 2);
	}
	data[m_isize++] = a;
}

void MyArray::printData() //打印数组
{
	for(int i = 0; i<m_isize;i++)
	{
		cout << data[i] << " ,";
	}
	cout << endl;
}

void MyArray::add(int pos, int a) //在pos索引位置添加元素
{
	if (m_isize == m_icapicity)
	{
		resize(m_icapicity *= 2);
	}
	if (pos > m_isize)
	{
		cout << "you input a wrong number which is out of the range" << endl;
	}
	else 
	{
		int i = m_isize;
		while (pos < i)
		{
			data[i] = data[i - 1];
			i--;
		}
		data[i] = a;
		m_isize++;
	}
}
void MyArray::addfirst(int a) //在起始处添加元素
{
	if (m_isize == m_icapicity)
	{
		resize(m_icapicity *= 2);
	}
	add(0, a);
}
int MyArray::removeData(int pos)//删除pos位置元素
{
	if (m_isize == m_icapicity / 4)//当删除元素使得size减小为capicity的1/4时,改变容量,减小1/2
	{
		resize(m_icapicity = m_icapicity / 2);
	}
	int ret = data[pos];
	for (int i = pos + 1; i < m_isize; i++) 
	{
		data[i-1] = data[i];
	}
	m_isize--;
	return ret;
}
int MyArray::getData(int pos) {
	if (pos>=m_isize)
	{
		printf("pos out of range!");
	}
	else
		return data[pos];
}

void MyArray::resize(int newCapicity)//实现动态变长数组,当size超过容量的时候不报错,而是调用该函数,改变容量
{
	m_icapicity = newCapicity;
	int *newData = new int[m_icapicity];
	for (int i = 0; i<m_isize; ++i)
	{
		newData[i] = data[i];
	}
	delete []data;
	data = newData;//先delete []data,然后让data指向新的空间.如果用java 这里不用delete,因为java有内存回收机制
}




アイデアの簡単な説明:要素を追加するとき、サイズ== capicityのとき、

1最初に新しい配列スペース(newData)を作成します。このスペースの容量は元のスペースの2倍です。

2次に、元の配列(データ)の値を新しい配列(newData)に割り当てます。

3元の配列スペースを削除します([]データを削除します)

4データが新しいスペースを指すようにします(data = newData)

エレメントを小さくする場合、容量を1/4または1/2にすると一般的に容量が小さくなります。手順は上記と同じです。

 

注:配列を作成するときに適用されるスペースが決定されるため、容量のみを変更することはできません。音量を変更するには、スペースを再申請する必要があります。

元の記事を59件公開 いいね46 30,000回以上訪問

おすすめ

転載: blog.csdn.net/sinat_41852207/article/details/88413228