给定的任务是用 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;
}

输出:

怎样用c++实现一个vector类_ci