写一个可变长度的数组类Array ,用途存放若干元素,个数未知。
思路:
1、可采用动态分配内存的方法。首先要有三大要素:数组的缓冲区m_buffer、需要存放元素的总容量m_capacity,已存放的元素计数:m_size,这些作为类的私有成员变量。用构造函数进行初始化,总容量capacity作为构造函数的参数,m_buffer动态创建,大小为m_capacity,m_size初始化为0
2、创建传输参数的函数,参数为传入元素val。总容量是有限值,考虑到元素个数未知,因而需要一个动态扩容函数,该函数为私有成员函数。 动态扩容函数:输入元素数量是否超出总容量? -> 超出则调用函数->在原来capacity的基础上加上部分容量作为新容量大小传给n -> 开辟新内存buf -> 将旧内存m_buffer中的内容拷贝到新内存中 -> 释放旧内存 -> 更新成员变量,将新内存n赋值给m_capacity,新缓冲区buf赋值给m_buffer。将传入元素送入缓存区m_buffer[m_size] = value -> 计数 m_size++。
3、在类的共有成员中加入返回size和capacity的函数,方便查看数组信息。
源代码如下:
#include <stdio.h>
#include <string.h>
//写一个可变长度的数组类Array ,用途存放若干元素,个数未知。
template<typename T>
class Array
{
public:
Array(int capacity=16)
{
m_buffer = new T[capacity];
m_capacity = capacity;
m_size = 0;
}
void Pushback(T val)
{
if(m_size >= m_capacity)
{
Resize();
}
m_buffer[m_size] = val;
m_size++;
int Size()
{
return m_size;
}
int Capacity()
{
return m_capacity;
}
}
private:
T* m_buffer; // 缓冲区 ,用于存储需要传入数组的所有对象 注意要用指针的形式
int m_capacity; //容量 即缓冲区的大小
// m_buffer m_capacity的关系类似于数组和数组的大小,都需要提前声明
int m_size; // 已经存放的对象的个数
void Resize()
{
//创建一个更大的缓冲区;
int n = m_capacity + 4;
T* buf = new T[n];
//拷贝原有的内容;
memcpy(buf,m_buffer,m_capacity);
//删除旧的内容
delete []m_buffer;
//更新成员变量
m_capacity = n;
m_buffer = buf;
}
};
int main()
{
Array<int> a;
a.Pushback(1);
a.Pushback(2);
a.Pushback(4);
printf()
return 0;
}