首页 > 其他分享 >STL01——手写简单版本的vector

STL01——手写简单版本的vector

时间:2024-09-10 16:21:30浏览次数:12  
标签:index elements capacity STL01 元素 vector 手写 size

STL01——手写简单版本的vector


设计一个名为 MyVector 的 Vector 类,该类应具备以下功能和特性:

1、基础成员函数:

构造函数:初始化 Vector 实例
析构函数:清理资源,确保无内存泄露
拷贝构造函数:允许通过现有的 MyVector 实例来创建一个新实例
拷贝赋值操作符:实现 MyVector 实例之间的赋值功能
2、核心功能:

添加元素到末尾:允许在 Vector 的末尾添加新元素
获取元素个数:返回 Vector 当前包含的元素数量
获取容量:返回 Vector 可以容纳的元素总数
访问指定索引处的元素:通过索引访问特定位置的元素
在指定位置插入元素:在 Vector 的特定位置插入一个新元素
删除数组末尾元素:移除 Vector 末尾的元素
清空数组:删除 Vector 中的所有元素,重置其状态
3、迭代与遍历:

使用迭代器遍历:实现迭代器以支持对 Vector 从开始位置到结束位置的遍历
遍历并打印数组元素:提供一个函数,通过迭代器遍历并打印出所有元素
4、高级特性:

容器扩容:当前容量不足以容纳更多元素时,自动扩展 Vector 的容量以存储更多元素
输入描述
题目的包含多行输入,第一行为正整数 N, 代表后续有 N 行命令序列。

接下来 N 行,每行包含一个命令,命令格式为 [operation] [parameters] ,具体命令如下:

push 命令:

格式:push [element]
功能:将 element 添加到 Vector 的末尾
size 命令:

格式:size
功能:返回 Vector 当前包含的元素数量
get 命令:
格式:get [index]
功能:返回 index 索引处的元素
insert 命令:

格式:insert [index] [element]
功能:在 Vector 的 index 索引处插入一个 element
pop 命令:

格式:pop
功能:移除 Vector 末尾的元素
clear 命令:

格式:clear
功能:删除 Vector 中的所有元素,重置其状态
print 命令:

格式:print
功能:提供一个函数,遍历并打印出所有元素
iterator 命令:

格式:iterator
功能:实现迭代器以支持对 Vector 从开始位置到结束位置的遍历
foreach 命令:

格式:foreach
功能:遍历并打印出所有元素
输出描述
题目包含 N 行输出,不同命令需要给出明确的反馈,输入格式如下:

push 命令:无输出

size 命令:输出一个整数,独占一行,代表当前 vector 中的元素数量

get 命令:输出一个整数,独占一行,如果索引有效,则输出指定索引处的元素,如果索引无效,则输出 -1

insert 命令:无输出

pop 命令:无输出

clear 命令:无输出

print 命令:按照顺序打印当前 vector 包含的所有元素,每个元素后都跟一个空格,打印结果独占一行;如果当前的 vector 为空,则打印 empty

iterator 命令:按照顺序打印当前 vector 包含的所有元素,每个元素后都跟一个空格,打印结果独占一行;如果当前的 vector 为空,则打印 empty

foreach 命令:按照顺序打印当前 vector 包含的所有元素,每个元素后都跟一个空格,打印结果独占一行;如果当前的 vector 为空,则打印 empty

#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <stdexcept>
using namespace std;

template<typename T>
class MyVector
{
private:
	T* elements;
	size_t capacity;
	size_t size;
public:
	MyVector()
	{
		elements = nullptr;//什么时候申请空间?
		capacity = 0;
		size = 0;
	}
	~MyVector()
	{
		delete[] elements;
	}
	MyVector(const MyVector& vector)
	{
		size = vector.size;
		capacity = vector.capacity;
		elements = new T[capacity];
		copy(vector.elements, vector.elements + size, elements);
	}
	MyVector& operator=(const MyVector& vector)
	{
		if (*this != vector)//剪枝
		{
			size = vector.size;
			capacity = vector.capacity;
			delete[] elements;//与拷贝构造函数不同之处是此时类已经申请了空间,使用需要释放旧空间,建立新空间。
			elements = new T[capacity];
			copy(vector.elements, vector.elements + size, elements);
		}
		return *this;
	}
	void reserve(size_t  newCapacity)//引用的作用
	{
		if (newCapacity > capacity)
		{
			T* newElement = new T[newCapacity];
			copy(elements, elements + size, newElement);
			delete[] elements;//释放了指针的空间,但是指针本身依然存在
			elements = newElement;
			capacity=newCapacity;
		}
	}
	void push(const T& val)
	{
		if (size == capacity)
			reserve(capacity == 0 ? 1 : 2 * capacity);
		elements[size] = val;
		size++;
	}
	size_t getSize()
	{
		return size;
	}
	size_t getCapacity()
	{
		return capacity;
	}
	T get(size_t index)
	{
		if (index >= size)
			throw out_of_range("index out of range");
		return elements[index];
	}
	void insert(size_t index,const T& val)
	{
		if (index > size)
			throw out_of_range("index out of range");
		if (size == capacity)
			reserve(capacity == 0 ? 1 : 2 * capacity);
		for (size_t i = size; i > index; i--)
		{
			elements[i] = elements[i - 1];
		}
		elements[index] = val;
		size++;
	}
	void pop()
	{
		if (size > 0)
			size--;
	}
	void clear()
	{
		size = 0;
	}
	T* begin()
	{
		return elements;
	}
	T* end()
	{
		return elements + size;
	}
	void print()
	{
		if (size == 0)
			cout << "empty" << endl;
		else{
		for (size_t i = 0; i < size; i++)
		{
			cout << elements[i] << " ";
		}
		cout<<endl;
		}
	}
	void iterator()
	{
		print();
	}
	void foreach()
	{
		print();
	}
	
};

int main() {
	int N;
	std::cin >> N;

	MyVector<int> myVector;

	for (int i = 0; i < N; ++i) {
		std::string command;
		std::cin >> command;

		if (command == "push") {
			int element;
			std::cin >> element;
			myVector.push(element);
		}
		else if (command == "size") {
			std::cout << myVector.getSize() << std::endl;
		}
		else if (command == "get") {
			int index;
			std::cin >> index;
			std::cout << myVector.get(index) << std::endl;
		}
		else if (command == "insert") {
			int index, element;
			std::cin >> index >> element;
			myVector.insert(index, element);
		}
		else if (command == "pop") {
			myVector.pop();
		}
		else if (command == "clear") {
			myVector.clear();
		}
		else if (command == "print") {
			myVector.print();
		}
		else if (command == "iterator") {
			myVector.iterator();
		}
		else if (command == "foreach") {
			myVector.foreach();
		}
		else {
			std::cerr << "Unknown command" << std::endl;
		}
	}

	return 0;
}

标签:index,elements,capacity,STL01,元素,vector,手写,size
From: https://blog.csdn.net/2402_84438596/article/details/142102448

相关文章

  • C++的数据类型----标准库类型(std::vector容器/std::list容器/std::map容器)的实例讲解
    目录1.字符串(std::string):用于处理文本字符串。2.容器:如std::vector、std::list、std::map等,用于存储和管理数据集合2.1std::vector容器2.2std::list容器2.3std::map容器1.字符串(std::string):用于处理文本字符串。下面是一个C++中字符串的示例程序......
  • 在vue3中手写按需加载图片
    在我们的网页中.假如使用了大量的图片,每个图片都是需要去访问加载的这就影响了我们的访问速度,手写一个按需加载组件,就可以解决这个问题让图片处于页面视图的时候再加载,减轻网页访问负担利用vue3官网给出的钩子我们常用的就是onMountent如官网所示为了及时监测,这里......
  • 手写数字识别总结
    项目介绍:每张图片都是28*28的像素1,使用全连接层图像拆分成一维像素阵列作为输入值,输入到神经网络中。打包多个图像输入称为一个batch2,输出数据需要做归一化,使数据概率在0-1之间3,一个batch_size设置为15,共训练两次通过调节a和b,使训练值与真实值的误差减小,形成一个最优解......
  • 如何实现标准库般强大的 C++ Vector?:从动态扩容到移动语义到迭代器全覆盖
    在C++中,std::vector是最常用的动态数组容器。它具有高效的内存管理、动态扩容、随机访问等特点。在这篇博客中,我们将从零开始,实现一个功能强大、灵活、并且具有高性能的Vector类,具备std::vector的大部分功能,包括动态扩容、迭代器、模板支持、随机访问等,尽可能模仿C+......
  • 腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 【C++】vector的模拟实现
    文章目录一、前言二、构造函数模拟实现构造函数调用不明确1.问题描述2、解决调用不明确的方法三、基础接口1.empty和clear2.size和capacity3.[]和iterator四、resize和reservereserve中的深浅拷贝问题1、reserve中浅拷贝发生原因2、浅拷贝发生的图解3、解决方法五、尾......
  • Vector
    publicstaticvoidmain(String[]args){//创建集合//实例化对象Vectorvector=newVector();//1添加元素vector.add("草莓");vector.add("芒果");vector.add("木瓜");System.out.println("元素个数:"+vector.size());//2删除元素//vector.remove(0)......
  • C++(std::vector)
    目录1.特性2.常用成员函数2.1构造函数2.2元素访问2.3修改容器2.4容量相关2.5迭代器3.内存管理与效率4.示例:5.性能分析:std::vector是C++标准库中的一个动态数组容器,位于#include<vector>头文件中。它是一个模板类,可以存储任何类型的对象,并根据需要动态调整其大......
  • C++vector类相关OJ练习
    个人主页:C++忠实粉丝欢迎点赞......
  • 又是经典的约瑟夫环问题plus版本及vector的熟练使用
    目录1.前言2.正文2.1问题2.2解决办法2.2.1思路2.2.2代码实现2.2.3测试结果3.备注1.前言我记得之前第一次遇到这个题目是当时说的是固定的一个数,就是说固定数3个数,显然比这个简单一点,因为动的数据显然更麻烦一点。有兴趣的小伙伴可以先去看之前的那篇博客......