下面我会详细讲解关于“C++动态数组类的封装实例”的完整攻略。
1. 背景介绍
在 C++ 中,原生的数组容量是固定的,一旦定义了大小就无法修改;而动态数组则允许在运行时根据需要动态的分配和释放内存,其容量也可以被动态的改变,因此动态数组类在 C++ 中封装及应用十分常见。
2. 算法设计
动态数组类的封装基本上涉及以下的核心内容:
2.1 成员变量
由于动态数组能够自动扩展和释放空间,因此成员变量中应该有一个指针变量,用于存储动态数组的地址,以及一个记录当前数组容量大小的整形成员变量。
class DynamicArray {
private:
T *data;
int capacity;
}
2.2 构造函数
在构造函数中,应该分配一段初始的空间大小给指针变量data
,并将当前capacity
设置为该大小。
DynamicArray(int initCapacity = 10) {
capacity = initCapacity;
data = new T[capacity];
}
2.3 析构函数
在析构函数中,应该清空data
指针,并释放其所指向的内存。
~DynamicArray() {
delete[] data;
data = nullptr;
capacity = 0;
}
2.4 成员函数
(1)获取数组容量的方法 getSize()
:
int getSize() {
return capacity;
}
(2)判断数组是否为空的方法 isEmpty()
:
bool isEmpty() {
return capacity == 0;
}
(3)在数组末尾添加元素的方法 add()
:
void add(T value) {
// 先判断当前数组是否已满
if (getSize() == capacity) {
// 如果已满,则扩展数组容量
int newCapacity = capacity * 2;
T *newData = new T[newCapacity];
for (int i = 0; i < capacity; i++) {
newData[i] = data[i];
}
delete[] data;
data = newData;
capacity = newCapacity;
}
// 添加元素
data[getSize()] = value;
}
(4)在指定位置插入元素的方法 insert()
:
void insert(int index, T value) {
// 先判断当前数组是否已满
if (getSize() == capacity) {
// 如果已满,则扩展数组容量
int newCapacity = capacity * 2;
T *newData = new T[newCapacity];
for (int i = 0; i < capacity; i++) {
newData[i] = data[i];
}
delete[] data;
data = newData;
capacity = newCapacity;
}
// 调整数组元素位置
for (int i = getSize(); i > index; i--) {
data[i] = data[i-1];
}
// 在指定位置插入元素
data[index] = value;
}
3. 示例说明
示例一
DynamicArray<string> arr;
arr.add("hello");
arr.add("world");
arr.insert(0, "C++");
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << endl;
}
该示例代码定义了一个DynamicArray
类型的对象arr
,并依次向其中添加了三个元素,然后在第一个位置插入了一个新元素。最后通过for
循环遍历输出数组中的每个元素。
示例二
DynamicArray<int> arr(5);
for (int i = 0; i < 10; i++) {
arr.add(i);
}
cout << "Array size: " << arr.getSize() << endl;
cout << "Array is empty? " << (arr.isEmpty()?"Yes":"No") << endl;
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << endl;
}
该示例代码定义了一个容量为5的DynamicArray
对象arr
,并通过for
循环向其中添加了10个元素,会发现容量自动扩展,最后输出数组容量及所有元素的值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++动态数组类的封装实例 - Python技术站