[C++]:11.模拟实现vector

2024-01-21

二.模拟实现vector

0.看一看源码SGI

1.vector.h

在这里插入图片描述

vector.h中其实包含了许多的头文件,我们在cpp中包含文件的时候头文件中还会去展开这四个头文件关于vector类主要在这个stl_vector.h中。

2.stl_vector.h

1.构造:

在这里插入图片描述

ps:在当前的学习阶段看源码不要一行一行去看因为水平不足所以非常多基本上是看不懂的所以不要去一行一行去看要全方面的去看有一些看不懂问题不大。

在这里插入图片描述

在这里插入图片描述

2.析构函数:

在这里插入图片描述

3.push_back()

在这里插入图片描述

1.构造函数:

1-1:参数为空的!

1.构造函数的初始化列表给全空:
2.构造函数的内容给赋值全空:
3.C++11 支持的声明变量的时候初始化(走的初始化列表):
4.综上所述第三个方法最方便:我们都可以在定义的时候去初始化非常的方便。


vector(size_t n , const T& val=T())
	:start(nullptr)
	,finish(nullptr)
	,end_of_storage(nullptr)
{
}

vector()
{
		start = nullptr;
		finish = nullptr;
		end_of_storage = nullptr;
}


private:
	iterator start = nullptr;
	iterator finish = nullptr;
	iterator end_of_storage = nullptr;


1-2:n个数据的!

情况一:n个数据传第二个参数初始化数据的:
情况二:n个数据不传第二个参数就开空间不初始化的:
1.对于我情况二的操作其实本质是初始化容量空间为全 val (内置类型的默认构造值),但是我的finish == start所以在后面使用的时候数据进入是赋值进入:

vector(size_t n , const T& val=T())
			{
				resize(n,val);
			}
vector(int n , const T& val=T())
			{
				resize(n,val);
			}

1-3:范围构造:

//1-3:范围初始化:
//1-4:使用新的模板方便使用不同类型的迭代器进行范围构造
			template<class InputIterator>
			vector(InputIterator left, InputIterator right)
			{
				while (left != right)
				{
					push_back(*left);
					left++;
				}
			}

2.析构函数:

//析构:
~vector()
{
	delete[] start;
	start = nullptr;
	finish = nullptr;
	end_of_storage = nullptr;
}

3.迭代器+遍历数据:

3-1:迭代器:

在这里插入图片描述

在这里插入图片描述

//3.迭代器:
		
			iterator begin()const
			{
				return start;
			}
			iterator end()const
			{
				return finish;
			}

			iterator_const cbegin()const
			{
				return start;
			}
			iterator_const cend()const
			{
				return finish;
			}

			iterator rbegin()const
			{
				return finis - 1;
			}
			iterator rend()const
			{
				return start-1;
			}

			iterator_const crbegin()const
			{
				return finis - 1;
			}
			iterator_const crend()const
			{
				return start - 1;
			}

3-2:数据遍历:

void print_value()const
			{
				assert(start != end_of_storage);
				int num = finish - start;

				for (int i = 0; i < num; i++)
				{
					cout << *(start + i) << " ";
				}
				cout << endl;
			}

			T& operator[](size_t pos)
			{
				return *(start + pos);
			}
void text_2()
{
	sfpy::vector<int> v1(10, 2);
	sfpy::vector<int> v2(v1);
	sfpy::vector<int> v3(10);

	sfpy::vector<int>::iterator it_1 = v1.begin();
	while (it_1 != v1.end())
	{
		cout << *it_1 << " ";
		it_1++;
	}
	cout << endl;

	v1.print_value();

	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;


	sfpy::vector<int>::iterator it_2 = v2.begin();
	while (it_2 != v2.end())
	{
		cout << *it_2 << " ";
		it_2++;
	}

	cout << endl;

	v2.print_value();

	for (int i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << " ";
	}
	cout << endl;
}

4.空间问题:

在这里插入图片描述

4-1:size() 和capacity

//4.size() 和 capacity()

	size_t size()const
	{
		return finish - start;
	}
	size_t capacity()const
	{
		return end_of_storage - start;
	}

4-2:resize 和 reserve:

void reserve(size_t n)
			{
				//assert(n > capacity());
				//1.重新配置空间:
				T* tmp = new T[n];

				if (n > capacity())
				{
					size_t n_1 = size();
					for (size_t i = 0; i < n; i++)
					{
						if (i < n_1)
						{
							tmp[i] = *(start + i);
						}
						else
						{
							tmp[i] = T();
						}
					}
					delete[] start;
					start = tmp;
					finish = tmp + n_1;
					end_of_storage = tmp + n;
				}
			}

			void resize(size_t n, T val = T())
			{
				if (n > size())
				{
					reserve(n);
					while (finish < start + n)
					{
						*finish = val;
						++finish;
					}
				}
				else
				{
					finish = start + n;
				}
			}

1.关于reserve的补充:
2.为什么不去使用memcpy这样的的函数本质这是一个浅拷贝。
3.调用delete[] 释放空间+调用析构函数。
4.内置类型使用memcpy没有问题。
5.对于自定义类型来说使用memcpy会产生浅拷贝的问题

在这里插入图片描述

在这里插入图片描述

4-3:empty

bool empty()
{
		if (size() == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
}

4-4:shrink_to_fit

void shrink_to_fit()
{
	assert(size() >= capacity);

	//1.重新配置空间:
	size_t n = size();
	T* tmp = new T[n];

	//减少:
	memcpy(tmp, start, size(T) * n);

	start = tmp;
	finish = end_of_storage = tmp + n;
}

5.增删查改:

5-1:push_back()

void push_back(const T& val)
{
	if (finish == end_of_storage)
	{
		size_t new_capacity =(start == finish ? 4 : (capacity() * 2));			
		reserve(new_capacity);
	}

	(*finish) = val;
	finish++;
}

在这里插入图片描述

5-2:pop_back()

void pop_back()
{
	assert(size() != 0);
	//resize(size() - 1);
	(*finish) = T();
	finish--;
}

在这里插入图片描述

5-3:find()

在这里插入图片描述

1.find()是一个全局函数不是一个特定的类就有一个find() .
2.find()是通过类模板实现的。
3.find()的返回值是一个iterator。

template <class T>
	T* find(T* first, T* last, const T& val)
	{
		while (first != last)
		{
			if (*first == val) 
				return first;

			++first;
		}
		return last;
	}

在这里插入图片描述

5-4:insert() :在find之前插入

在这里插入图片描述

iterator insert(iterator position, const T& val)
{
				size_t pos = position - start;
				size_t n = size();

				if (finish == end_of_storage)
				{
					size_t new_capacity = (start == finish ? 4 : (capacity() * 2));
					reserve(new_capacity);
				}

				//void * memmove ( void * destination, const void * source, size_t num );

				memcpy(start + pos + 1, start + pos, (n - (pos))*sizeof(T));
				*(start + pos) = val;
				finish++;

				return start + pos;
}

在这里插入图片描述

5-5:erase() : 删除find位置

在这里插入图片描述

iterator erase(iterator position)
			{
				assert(size() != 0);

				size_t pos = position - start;
				size_t n = size();

				//void * memmove ( void * destination, const void * source, size_t num );
				memcpy(start + pos , start + pos +1, (n - (pos+1)) * sizeof(T));
				finish--;

				return start + pos;
			}

在这里插入图片描述

5-6:insert和erase

1.在vs下insert和erase传进去的迭代器在使用之后就不可以继续使用了(有可能发生迭代器失效的情况)。
2.在vs下是会认为迭代器失效。
3.模拟实现insert和erase —> insert返回插入新的元素的迭代器,erase返回删除元素的下一个元素的迭代器。
4.pos就不要继续使用应该去使用insert和erase的返回值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[C++]:11.模拟实现vector 的相关文章

  • Entity Framework 4.1 RC:Code First EntityTypeConfiguration 继承问题

    我尝试使用通用的 EntityTypeConfiguration 类来配置所有实体的主键 以便每个派生的配置类不会重复自身 我的所有实体都实现一个公共接口 IEntity 它表示每个实体必须有一个 int 类型的 Id 属性 我的配置基类如
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 使用成员作为实现者来实现接口

    我有实现 IA 的 A 类 现在我需要创建也应该实现 IA 的类 B B 类有 A 类的实例作为成员 有什么方法可以定义A的实例实现B类中的IA吗 interfase IA void method1 void method2 void me
  • 如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

    我正在尝试制作一系列标签 每个标签都有一个来自函数的不同值 我不知道要使用的标签的确切数量 我的意思是可以打印任意数量的值 请帮我做这件事 很简单 只需一个方法返回一个数组或一些 JLabels 集合 并将它们全部添加到您的 JCompon
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • 为什么 RMI 注册表忽略 java.rmi.server.codebase 属性

    我正在运行 java RMI 的 Hello World 示例 1 我在空文件夹中运行注册表 motta motta laptop tmp rmiregistry 2 我启动 HTTP 服务器以在运行时检索类 下载文件夹包含客户端 服务器的
  • 枚举器上的 [[maybe_unused]]

    查看规格 maybe unused http en cppreference com w cpp language attributes 它指出 出现在类 typedef 变量 非静态数据成员 函数 枚举或枚举器的声明中 如果编译器对未使用
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • 使用互斥锁来阻止临界区外部的执行

    我不确定我的术语是否正确 但这里是 我有一个由多个线程使用的函数来写入数据 在注释中使用伪代码来说明我想要的内容 these are initiated in the constructor int data std atomic
  • System.diagnostics.process 进程在托管后无法在 IIS 上运行?

    我正在尝试从网络应用程序安装 exe 当我在本地运行应用程序 从 asp 开发服务器 时 它安装正确 但当我托管在 IIS 上时 它不起作用 我在asp net页面的Page load方法上编写了这段代码 想要在客户端计算机上安装Test
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • 如何从代码隐藏中向我的 div 添加点击事件?

    如何从代码隐藏中向我的 div 添加点击事件 当我点击 div 时 会出现一个消息框 其中显示 您想删除它吗 并在框中显示 是 或 否 全部来自后面的代码 while reader Read System Web UI HtmlContro
  • C 中什么函数可以替换字符串中的子字符串?

    给定一个 char 字符串 我想查找所有出现的子字符串并将其替换为备用字符串 我没有看到任何简单的函数可以实现这一点
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • JPA - 非主键字段上的 @OneToOne 关系不起作用

    我有一个 Spring Data JPA 后端 使用 Hibernate 作为 ORM 实现 这是模型 Person MailConfig id PK uid PK FK Person uid uid Entity
  • 当我在 Java 中输入 IP 时无法连接到我的服务器

    好的 我正在尝试学习 Java 客户端 服务器的内容 并且正在浏览教程代码 如下所示 当我将 localhost 更改为我的 IP 时 它会停止工作 请帮忙 编辑 127 0 0 1 似乎也可以工作 但不是我的真实IP Copyright
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs
  • FakeItEasy 代理方法调用实际实现

    我正在尝试将对假对象的调用代理到实际的实现 这样做的原因是我希望能够使用 Machine Specifications 的 WasToldTo 和 WhenToldTo 它们仅适用于接口类型的伪造 因此 我正在执行以下操作来代理对我的真实对

随机推荐

  • Python自动化操作:简单、有趣、高效!解放你的工作流程!

    今天跟大家分享一套自动化操作流程解决方案 基于 Python语言 涉及 pyautogui pyperclip pythoncom win32com 依赖包 安装命令为 pip install pyautogui pip install p
  • 怎么注册微商城?开启微商城之旅

    在这个数字化时代 微商城的出现为商家提供了一个全新的机会 商家企业可以通过微商城来展示和销售自己的产品 而对于一些商家而言 不知道怎么注册微商城 下面给大家做一个简单的分享 第一步 选择合适的微商城搭建工具 在注册微商城之前 首先需要选择一
  • 2024年网络安全十10大发展趋势发布

    2023年网络安全十10大发展趋势发布 近日 中国计算机学会 CCF 计算机安全专委会中 来自国家网络安全主管部门 高校 科研院所 大型央企 民营企业的委员投票评选出2023年网络安全十大发展趋势 福利 趋势一 数据安全治理成为数字经济的基
  • Windows7系统iprop.dll文件丢失问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个iprop d
  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • 图解python | 字符串及操作

    1 Python元组 Python的元组与列表类似 不同之处在于元组的元素不能修改 元组使用小括号 列表使用方括号 元组创建很简单 只需要在括号中添加元素 并使用逗号隔开即可 tup1 ByteDance ShowMeAI 1997 202
  • 每天10个前端小知识 <Day 5>

    前端面试基础知识题 1 typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法 区别如下 typeof会返回一个变量的基本类型 instanceof返回的是一个布尔值 instanceo
  • 2024年华数杯国际赛B题:光伏发电功率 思路模型代码解析

    2024年华数杯国际赛B题 光伏发电功率 Photovoltaic Power 一 问题描述 中国的电力构成包括传统能源发电 如煤 油和天然气 可再生能源发电 如水电 风能 太阳能和核能 以及其他形式的电力 这些发电模式在满足中国对电力的巨
  • iprtrmgr.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个iprtrmg
  • 前端基础:回顾es6相关知识

    Author note 题记 ECMAscript is international standard of javascript ECMA 是 js的国际标准版语言 let and const 为什么之前用var现在需要用let cons
  • iPhone16或全系升级8GB内存,支持Wi-Fi 6E!

    随着新的一年到来 苹果下一代机型iPhone 16系列的爆料也越来越充实 越来越详细 从多个爆料中 我们甚至已经都够想象出下一代iPhone的基本雏形 海通国际技术分析师Jeff Pu 为我们带来了新的内容 这位分析师称 iPhone 16
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • ir50_32.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个ir50 32
  • 【固定翼飞机】基于最优控制的固定翼飞机着陆控制器设计研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 深度好文:最全的大模型 RAG 技术概览

    本文是对检索增强生成 Retrieval Augmented Generation RAG 技术和算法的全面研究 对各种方法进行了系统性的梳理 涉及了 RAG 流程中的数据拆分 向量化 查询重写 查询路由等等 在做 RAG 的小伙伴一定知道
  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 图解python | 基础数据类型

    1 Python变量类型 Python基本数据类型一般分为6种 数值 Numbers 字符串 String 列表 List 元组 Tuple 字典 Dictionary 集合 Set 本文详细讲解Python中变量赋值 数据类型以及数据类型
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 外包干了3个月,技术退步明显。。。。。

    先说一下自己的情况 本科生 19年通过校招进入广州某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • [C++]:11.模拟实现vector

    模拟实现vector 二 模拟实现vector 0 看一看源码SGI 1 vector h 2 stl vector h 1 构造 2 析构函数