可变长数组举例
#include<cstringt.h>
//可变长数组
// new delete 更改长度 new新空间 , copy旧空间 , delete旧空间
// malloc free relloc 分配起来更简单
class MyArray
{
public:
MyArray(const size_t len=10)//给初始长度
{
_index = 0;
_len = len;
_data = new int[_len];
}
~MyArray()
{
if (_data)
delete[]_data;
}
int GetData(const size_t index) const
{
if (_len > index)
return _data[index];
return 0;
}
void SetData(const size_t index, const int num)
{
if (_len > index)
_data[index] = num;
}
unsigned int GetLen() const //有效的长度 返回_index
{
return _index;
}
void AddData(const int num) //可以把Add和set合并
{
if (_index >= _len)
{
_len = _index * 2;
int *temp = new int[_len];//每次分配*2的空间
memcpy(temp, _data, _index*sizeof(int));
delete[]_data;
_data = temp;
}
_data[_index++] = num; // index后++ ,否则无_data[0]
}
void AddData(const MyArray&data) //增加自身对象
{
for (unsigned int i = 0; i < data._index; ++i)
{
//const 方法能够被const对象调用, const对象只能调用const方法
AddData(data.GetData(i));//不能将“this”指针 每一个对象里面的隐藏属性,每一个对象都有
//this 是一个对象的代名词,区分不同的对象
//每一个类里面,为了区分每一个对象,会默认包含一个this指针
//
}
}
void AddData(const int *data,const unsigned int ) //增加数组,需要长度参数
{
for (int i = 0; i < _len; i++)
{
AddData(data[i]);
}
}//写函数的重载时,会相互调用,节约代码量
/*int& Index( const size_t index)
{
if (index<_len)
return _data[index];
} 使用引用直接返回,返回index>len的情况不方便表示*/
private:
int *_data;
unsigned int _len; //已经分配的空间
unsigned int _index; //已经使用的空间
};