给定的任务是用 C++实现一个类,这个类的行为要和标准库中的 Vector 类一样。
向量(Vector)就像动态数组一样,当插入或删除一个元素时,它能够自动调整自身大小,其存储由容器自动管理。vector中的元素被放置在连续的存储空间中,这样就可以使用迭代器来访问和遍历它们。在向量中,数据是在末尾插入的。在末尾插入的时间是不同的,因为有时候可能需要扩展数组。删除最后一个元素只需要常量时间,因为不需要调整大小。在开头或中间插入和删除是线性时间复杂度。
我们也可以使用模板使vector类成为泛型类。
我们要实现的与vector相关的一些函数有:
void push(int data)
:这个函数接受一个元素并将其插入到末尾。时间复杂度是 O(1)。void push(int data, int index)
:它在指定的索引处插入数据。时间复杂度是 O(1)。int get(int index)
:用于获取指定索引处的元素。时间复杂度是 O(1)。void pop()
:它删除最后一个元素。时间复杂度是 O(1)。int size()
:它返回向量的大小,也就是向量中的元素个数。时间复杂度是 O(1)。int getcapacity()
:它返回向量的容量。时间复杂度是 O(1)。void print()
:用于打印数组元素。时间复杂度是 O(N),其中 N 是向量的大小。
下面是我们自己实现的 Vector 类的代码。
// 在 C++ 中实现自定义的 Vector 类
#include <iostream>
using namespace std;
template <typename T> class vectorClass {
// arr 是一个指针,存储我们的 vector 的地址
T* arr;
// capacity 是 vector 的总存储容量
int capacity;
// current 是当前 vector 中的元素数量
int current;
public:
// 默认构造函数,初始化一个容量为 1 的元素,并使用动态分配分配存储空间
vectorClass()
{
arr = new T[1];
capacity = 1;
current = 0;
}
// 析构函数,释放动态分配的存储空间,以防止内存泄漏
~vectorClass() { delete[] arr; }
// 函数,用于在末尾添加一个元素
void push(T data)
{
// 如果元素数量等于容量,意味着没有空间容纳更多的元素。
// 需要将容量加倍
if (current == capacity) {
T* temp = new T[2 * capacity];
// 将旧数组中的元素复制到新数组中
for (int i = 0; i < capacity; i++) {
temp[i] = arr[i];
}
// 删除之前的数组
delete[] arr;
capacity *= 2;
arr = temp;
}
// 插入数据
arr[current] = data;
current++;
}
// 函数,用于在任意索引处添加元素
void push(T data, int index)
{
// 如果索引等于容量,则此函数与上面定义的 push 函数相同
if (index == capacity)
push(data);
else
arr[index] = data;
}
// 函数,用于获取任意索引处的元素
T get(int index)
{
// 如果索引在范围内
if (index < current)
return arr[index];
// 如果索引不在范围内
return -1;
}
// 函数,用于删除最后一个元素
void pop() { current--; }
// 函数,用于获取 vector 的大小
int size() { return current; }
// 函数,用于获取 vector 的容量
int getcapacity() { return capacity; }
// 函数,用于打印数组元素
void print()
{
for (int i = 0; i < current; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
};
// 驱动代码
int main()
{
vectorClass<int> v;
vectorClass<char> v1;
v.push(10);
v.push(20);
v.push(30);
v.push(40);
v.push(50);
v1.push(71);
v1.push(72);
v1.push(73);
v1.push(74);
cout << "Vector 大小 : " << v.size() << endl;
cout << "Vector 容量 : " << v.getcapacity() << endl;
cout << "Vector 元素 : ";
v.print();
v.push(100, 1);
cout << "\n更新第 1 个索引后的结果" << endl;
cout << "int 类型的 Vector 元素 : " << endl;
v.print();
// 这之所以可能,是因为我们使用了模板
cout << "char 类型的 Vector 元素 : " << endl;
v1.print();
cout << "int 类型的第 1 个索引处的元素: " << v.get(1)
<< endl;
cout << "char 类型的第 1 个索引处的元素: "
<< v1.get(1) << endl;
v.pop();
v1.pop();
cout << "\n删除最后一个元素后的结果" << endl;
cout << "int 类型的 Vector 大小: " << v.size() << endl;
cout << "char 类型的 Vector 大小: " << v1.size()
<< endl;
cout << "int 类型的 Vector 容量 : "
<< v.getcapacity() << endl;
cout << "char 类型的 Vector 容量 : "
<< v1.getcapacity() << endl;
cout << "int 类型的 Vector 元素: ";
v.print();
cout << "char 类型的 Vector 元素: ";
v1.print();
return 0;
}
输出: