首页 > 编程语言 >怎样用c++实现一个vector类

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

时间:2024-09-06 12:24:21浏览次数:11  
标签:arr int 元素 c++ current vector push 怎样


给定的任务是用 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类_时间复杂度


标签:arr,int,元素,c++,current,vector,push,怎样
From: https://blog.51cto.com/u_16998908/11937118

相关文章

  • 【C++编程题】格雷码与自然二进制码转换
        格雷码是数字信号处理中常用编码方式。格雷码中任意两个相邻代码的二进制位中只有一位不同,对于最大编码和最小编码也成立。1.异或法转换1.1二进制码转格雷码二进制码转格雷码[1]1)将二进制最高位保留;2)对于二进制码中剩余的任意第i位,将其与......
  • 《C++编程规范》五、类的设计与继承
    目录第32条弄清所要编写的是哪种类第32条弄清所要编写的是哪种类了解自我:有很多种不同的类。弄清楚要编写的是哪一种。不同种类的类适用于不同用途,因此遵循着不同的规则。值类(如std::pair,std::vector)模仿的是内置类型。一个值类应该:有一个公用析构函数、复制构造函......
  • C++ STL map/multimap容器
    map/multimap容器Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一个元素被视为键值,第二个元素被视为实值,map不允许两个元素有相同的键值。multimap和map的操作类似,唯一区别是multimap的键值可以重复。注意:Map和multimap都......
  • C++(lambda)
    目录1.语法2.示例3.捕获方式4.可变性(mutable关键字)5.Lambda表达式的用途总结C++中的lambda表达式是一种匿名函数,通常用于简化代码,尤其是在处理临时或小型回调函数时。Lambda表达式引入于C++11,并在之后的C++标准中不断增强。它们可以捕获上下文中的变量,生成临时的函数对象......
  • 【C++】vector有关代码
     C++代码:#include<iostream>#include<vector>intmain(){//创建一个整数类型的vector并初始化std::vector<int>v={1,2,3};//使用迭代器遍历并打印vector中的每个元素for(autoi=v.begin();i!=v.end();++i){std::c......
  • C++ STL set/multiset容器
    set/multiset容器简介Set的特性是,所有元素都会根据元素的值自动被排序。Set不允许两个元素有相同的值。Set的迭代器iterator是一种const_iterator,不能通过迭代器改变任意set元素的值。multiset的特性和用法和set相同,唯一的差别在于它允许值重复。set和multiset的底层实现是红......
  • C++(#include <algorithm>)
    目录1.std::sort2.std::reverse3.std::find4.std::copy5.std::equal6.std::for_each7.std::unique8.std::transform总结#include<algorithm>是C++标准库中的一个头文件,包含了许多常用的算法函数,提供了操作容器、范围和数据的功能。这个库中的算法大多数是通用的,可......
  • 南沙信C++陈老师解一本通题: 2031:【例4.17】四位完全平方数
    ​ 题目描述】输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。【输入】无【输出】由小到大输出,每个数占一行。【输入样例】无【输出样例】无#include<bits/stdc++.h>usingnamespacestd;boolisSquare(intn){ inttmp=(int)sqrt(n......
  • 第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组
    之前没接触过oi赛制打了一下心态小崩。。以为会了五题写出来对了两题,我就是纯纯小丑哈哈。只打了两个小时也不能算正经vp把,就当是一个补题2.灭鼠先锋推必败必胜局面即可。具体的我就是乱推的,对于必胜的可能要稍微多想一会,对于必败的只要找出一种必败情况那显然就是必败了。但是......
  • C++ | 泛型编程:模板初阶与函数模板深度解析
    文章目录C++泛型编程:模板初阶与函数模板深度解析1.泛型编程:实现代码的通用性2.函数模板:代码的模具2.1什么是函数模板?2.2函数模板的格式2.3函数模板的原理2.4函数模板的实例化2.5模板参数的匹配原则3.类模板:更进一步的通用性3.1类模板的定义3.2类模板的实例化......