可变长数组类的实现
成员变量:size表示元素的个数,ptr指针指向动态分配的数组
成员函数:拷贝构造函数,析构函数释放空间
重载运算符 '='? ?用于对象间的赋值
重载运算符“[]” 用以支持根据下标访问数组元素
'push_back函数 用于在数组尾部添加一个元素
length 函数 用于返回数组的长度
程序实现如下:
#include <iostream>
#include <cstring>
using namespace std;
class CArray {
private:
int size;//数组元素的个数
int* ptr;//指向动态分配的数组
public:
CArray(int s = 0); //s代表数组元素的个数
CArray(CArray& a); //拷贝构造函数
~CArray(); //析构函数
void push_back(int v);//用于在数组尾部添加一个元素v
CArray& operator = (const CArray& a);//用于对象间的赋值
int length() { return size; }
//非引用的函数返回值不可以作为左值使用
int& operator[](int i);//返回值为int 不支持a[i] = 4
};
CArray::CArray(int s) :size(s)
{
if (s == 0)
ptr = NULL;
else
ptr = new int[s];
}
CArray::CArray(CArray& a)//拷贝构造函数的实现
{
if (!a.ptr) {
ptr = NULL;
size = 0;
return;
}
ptr = new int[a.size];
memcpy(ptr, a.ptr, sizeof(int) * a.size);
//a.ptr指向的内容拷贝到ptr 拷贝了sizeof(int) * a.size个字节
size = a.size;
}
CArray::~CArray()
{
if (ptr) delete[]ptr;
}
CArray& CArray::operator=(const CArray& a)
{
if (ptr == a.ptr) //防止a = a这样的赋值导致出错
return *this;
if (a.ptr == NULL) { //如果a里面的数组是空的
if (ptr) delete[]ptr;
ptr = NULL;
size = 0;
return *this;
}
if (size < a.size) {
if (ptr)
delete[] ptr;
ptr = new int[a.size];
}
memcpy(ptr, a.ptr, sizeof(int) * a.size);
size = a.size;
return *this;
}
int& CArray::operator[](int i)
{
return ptr[i];
}
void CArray::push_back(int v)//在数组尾部添加一个元素
{
if (ptr) {
int* tmpPtr = new int[size + 1];//重新分配空间
memcpy(tmpPtr, ptr, sizeof(int) * size);//拷贝原数组内容
delete[]ptr;
ptr = tmpPtr;
}
else //数组本来是空的
ptr = new int[1];
ptr[size++] = v;//加入新的数组元素
}
int main()
{
CArray v;
for (int i = 0; i < 5; i++) {
v.push_back(i);
}
CArray v2, v3;
v2 = v;
for (int i = 0; i < v.length(); i++) {
cout << v2[i] << " ";//输出0 1 2 3 4
}
v2 = v3;//v2空的
for (int i = 0; i < v2.length(); i++) {
cout << v2[2] << " ";
}
cout << endl;
v[3] = 100;
CArray v4(v);
for (int i = 0; i < v4.length(); i++) {
cout << v4[i] << " ";//输出0 1 2 100 4
}
return 0;
}
?关于push_back()成员函数的实现
每添加入一个元素便重新分配空间, 这是十分低效的做法,比如可以每次开空间的时候开32个, 每次到32个,时再开32个 ,这样就避免了每次都要重新分配空间,提高效率。
标准模板库中的vector的push_back原理:
vector有预存的内存(capacity),如果存入的元素大于了capacity,就重新分配一个比原来capacity大两倍的内存。
?摘自:
程序设计与算法(三)C++面向对象程序设计
|