STL-vector类

目录

vector介绍及其使用

        介绍

        使用 

        vector定义

vector iterator 

vector内存管理 

 vector内容管理

 vector的模拟实现

vector的迭代器失效 

        会引起迭代器失效的操作 


vector介绍及其使用

        介绍

        向量是序列容器,表示大小可以变化的数组     

        见  chttps://cplusplus.com/reference/vector/vector/

        使用 

        vector定义

vector()无参构造
vector(size-type n,const value_type&val = value_type())构造并初始化n个val
vector(const vector & x)拷贝构造
vector(inputlterator first,inputlterator last)用迭代器初始化构造

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> A;
	vector<int> B(5,1);
	vector<int> C(B);
	vector<int> D(C.begin(),C.end());
}

vector iterator 

begin + end获取第一个数据的位置,和最后一个数据的下一个位置
rbegin+rend获取最后一个数据的位置,和第一个位置的上一个位置

  

int main()
{
	vector<int> B(5,1);
	for (auto it = B.begin(); it != B.end(); it++)
		cout << *it << ' ';

	cout << endl;

	for (auto rit = B.rbegin(); rit != B.rend(); rit++)
		cout << *rit << ' ';
}

vector内存管理 

size数据个数
capacity容量大小
empty判断为空
resize改变size
reserve改变capacity

        注意 

        reserve只会开辟空间,不会缩小 

        resize大于reserve会申请空间小于size会减少数据个数

int main()
{
	vector<int> A(100, 0);
	cout << A.empty()<<' ' << A.size() <<' ' << A.capacity() << endl;
	A.resize(200, 1);
	cout << A.empty() << ' ' << A.size() << ' ' << A.capacity() << endl;
	A.reserve(1000);
	A.reserve(100);
	cout << A.empty() << ' ' << A.size() << ' ' << A.capacity() << endl;
	A.resize(20);
	cout << A.empty() << ' ' << A.size() << ' ' << A.capacity() << endl;
}

 vector内容管理

push_back尾插
pop_back尾删
find查找
insert

插入

erase删除
swap交换两个vector的数据空间
operator[]访问

	vector<int> A;
	A.push_back(1);
	A.push_back(2);
	cout << A.back()<<' ';
	A.pop_back();
	cout << A.back()<<' ';
	auto pos = find(A.begin(), A.end(), 1);
	cout << *pos << ' ';
	A.insert(pos, 0);
	cout << A.front()<<' ';
	A.erase(find(A.begin(),A.end(),1));
	cout << A.back() << ' ';
	cout << A[0];
	return 0;

 vector的模拟实现

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <assert.h>
namespace my_vector
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;
		iterator begin()
		{
			return _start;
		}
		iterator end()
		{
			return _finish;
		}
		const_iterator cbegin() const
		{
			return _start;
		}
		const_iterator cend() const
		{
			return _finish;
		}

		vector() :_start(new T[0]), _finish(_start), _endOfStorage(_start) {}

		vector(int n, const T& value = T())
		{
			while (n--)
			{
				this->push_back(value);
			}
		}

		template<class InputIterator>
		vector(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				push_back(*first);
				++first;
			}
		}
		vector(const vector<T>& v)
		{
			reserve(v.capacity());
			iterator it = begin();
			const_iterator vit = v.cbegin();
			while (vit != v.cend())
			{
				*it++ = *vit++;
			}
			_finish = it;
		}
		vector<T>& operator= (vector<T>& v)
		{
			vector<T> tmp(v);
			swap(*this, tmp);
		}

		~vector()
		{
			if (_start)
			{
				delete[] _start;
				_start = _finish = _endOfStorage = nullptr;
			}
		}

		void push_back(const T& x)
		{
			insert(end(), x);
		}

		iterator insert(iterator pos, const T& x)
		{
			assert(pos>= _start);
			if (_finish == _endOfStorage)
			{
				size_t locate = pos - _start;
				reserve(this->capacity() == 0 ? 4 : this->capacity() * 2);
				pos = _start + locate;
			}

			iterator end = _finish - 1;
			while (end >= pos)
			{
				*(end + 1) = *end;
				--end;
			}
			_finish++;
			*pos = x;
			return pos;
		}



		size_t size() const
		{
			return _finish - _start;
		}

		size_t capacity() const
		{
			return _endOfStorage - _start;
		}

		void reserve(size_t n)
		{
			if (n > this->capacity())
			{
				size_t size = this->size();
				T* new_start = new T[n];
				memcpy(new_start, _start, sizeof(T) * size);

				delete[] _start;

				_start = new_start;
				_finish = _start + size;
				_endOfStorage = _start + n;
			}
		}

		void swap(vector<T>& other)
		{
			std::swap(this->_start, other._start);
			std::swap(this->_finish, other._finish);
			std::swap(this->_endOfStorage, other._endOfStorage);
		}

		void resize(size_t n, const T& value = T())
		{
			if (n > this->size())
			{
				while (n >= this->size())
				{
					push_back(value);
				}

			}
		}

		iterator erase(iterator pos)
		{
			iterator end = _finish - 2;
			while (end >= pos)
			{
				*(end) = *(end+1);
				--end;
			}
			--_finish;
			return pos;
		}

		void pop_back()
		{
			erase(this->end());
		}

	private:
		iterator _start;//开始
		iterator _finish;//有效数据的尾
		iterator _endOfStorage;//容量的尾
	};
}

vector的迭代器失效 

        迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。

        会引起迭代器失效的操作 

        改变底层空间的操作,都有可能导致迭代器失效,如resize,reserve,insert,assign,push_back等

        改变空间大小后,可能前往了一个新的地方申请空间,而且释放了原有空间,那么指向原有空间的迭代器就属于"野指针",也就失效了

int main()
{
	vector<int> A(10, 0);
	auto pos = A.begin();
	A.reserve(1000);
	cout << *pos;
	return 0;
}

        erase清除元素导致

int main()
{
	vector<int> A(10, 0);
	auto pos = A.begin();
	A.erase(pos);
	cout << *pos;
	return 0;
}

         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937114.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

http1.1 vs http2.0 速度对比实测

首先对比一下http1.1 vs http2.0 区别&#xff1a; 1. 连接管理&#xff1a; HTTP/1.1: 每个请求/响应都需要一个独立的 TCP 连接&#xff0c;虽然可以使用持久连接&#xff08;keep-alive&#xff09;来复用连接&#xff0c;但仍然存在请求队头阻塞&#xff08;Head-of-Line…

JAVA学习日记(二十六)网络编程

一、网络编程的概念 常见的软件架构&#xff1a; 二、网络编程三要素 IP&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 端口号&#xff1a;应用程序在设备中的唯一标识 协议&#xff1a;数据在网络中传输的规则&#xff0c;常见的协议有UDP、TCP、http、https、f…

域名信息(小迪网络安全笔记~

附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;若有错误欢迎指正&#xff01; 2.1 域名信息 引子&#xff1a;上一章介绍了服务器的信息收集。本篇则介绍在面对存在Web资产企业时&#xff0c;其域名信息该如何收集。…

ubuntu18.04配置实时内核

ubuntu系统&#xff1a;18.04 当前内核&#xff1a;5.4.0-84-generic 待安装实时内核&#xff1a; 5.6.19-rt11 1、查看当前版本 uname -r 2、下载内核与补丁 一种方式从官网自己下载 官方内核下载地址官方补丁下载地址阿里镜像内核下载地址&#xff08;速度快&#xff0…

Lumos学习王佩丰Excel第二十一讲:经典Excel动态图表实现原理

一、动态图表实现原理 1、理解图表中的数据系列 在Excel图表中&#xff0c;系列指的是图表中的数据集合&#xff0c;它通常代表着一个数据源。每个系列都可以包含多个数据点&#xff0c;这些数据点在图表中以特定的形式展现&#xff0c;如柱状图中的柱子&#xff0c;折线图中…

医学分割数据集B超图像肾脏分割数据集labelme格式715张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;715 标注数量(json文件个数)&#xff1a;715 标注类别数&#xff1a;1 标注类别名称:["kidney"] 每个类别标注的框数&#x…

福湘板材:树立行业一线品牌典范

在当今的建筑装修市场中&#xff0c;板材作为一种重要的建筑材料&#xff0c;其品质和性能直接关系到工程质量和使用寿命。福湘板材&#xff0c;作为一个在行业内具有广泛影响力的品牌&#xff0c;一直以来都以高品质、环保性能和卓越的服务赢得了广大消费者的认可&#xff0c;…

redis数据类型(一)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1. String 字符串类型 常见命令: 1. set 2. get 3. MGET和MSET 4.SETNX 5. setex和psetex 计数命令: 1. INCR 2. IN…

在 macOS 下安装和使用 Clang Static Analyzer

在 macOS 下安装和使用 Clang Static Analyzer 相对简单&#xff0c;因为 macOS 自带 Clang 编译器&#xff0c;并且工具链已经包含了静态分析器的功能。以下是详细步骤&#xff1a; 1. 检查系统自带的 Clang macOS 自带 Clang 编译器&#xff0c;安装在 Xcode 或 Xcode Comm…

docker简单私有仓库的创建

1&#xff1a;下载Registry镜像 导入镜像到本地中 [rootlocalhost ~]# docker load -i registry.tag.gz 进行检查 2&#xff1a;开启Registry registry开启的端口号为5000 [rootlocalhost ~]# docker run -d -p 5000:5000 --restartalways registry [rootlocalhost ~]# dock…

搭建mqtt服务端并在Spring Boot项目中集成mqtt

文章目录 一、MQTT1.MQTT 的特点2.MQTT 的工作原理3.MQTT 的应用场景 二、EMQX(服务端)1.EMQX 的特点2.安装 三、客户端1.MQTTX2.EMQX后台建客户端3.H5页面客户端4.Spring Boot集成mqtt做客户端 一、MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息…

Easysearch Java SDK 2.0.x 使用指南(一)

各位 Easysearch 的小伙伴们&#xff0c;我们前一阵刚把 easysearch-client 更新到了 2.0.2 版本&#xff01;借此详细介绍下新版客户端的使用。 新版客户端和 1.0 版本相比&#xff0c;完全重构&#xff0c;抛弃了旧版客户端的一些历史包袱&#xff0c;从里到外都焕然一新&am…

《计算机视觉证书:开启职业发展新航道》

一、引言 在当今科技飞速发展的时代&#xff0c;计算机视觉技术正以惊人的速度改变着我们的生活和工作方式。从智能手机的人脸识别解锁到自动驾驶汽车的环境感知&#xff0c;计算机视觉技术的应用无处不在。而计算机视觉证书作为这一领域的专业认证&#xff0c;其作用愈发凸显…

ubuntu 用 ss-tproxy的最终网络结构

1、包含了AD广告域名筛选 2、Ss-tproxy 国内国外地址分类 3、chinadns-ng解析 4、透明网关 更多细节看之前博客 ubuntu 用ss-TPROXY实现透明代理&#xff0c;基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。ubuntu 用 ss-tproxy的内置 DNS 前挂上 AdGuardHome…

OpenCV相关函数

一、二值化函数&#xff08;threshold&#xff09; 功能&#xff1a;将灰度图像转换为二值图像&#xff0c;通常用于图像分割。通过设置阈值&#xff0c;把图像中低于阈值的像素设为0&#xff0c;高于阈值的像素设为1。 参数&#xff1a; src&#xff1a;输入图像。 thresh&a…

前端html,vue使用第三方地图详细教程,以百度地图为例,实现地图标注,导航,定位,路线规划,坐标转换

目录 示例&#xff1a; 准备&#xff1a; ?编辑 开始&#xff1a; 1、新建页面&#xff0c;在script标签中引入百度地图的api数据&#xff0c;把自己在控制台创建的应用的ak替换上去 2、创建一个dom对象&#xff0c;设置宽高 3、在js中初始化地图 进阶&#xff1a; 1…

【经验分享】容器云搭建的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

【Liunx篇】基础开发工具 - vim

文章目录 一.vim的基本概念1.正常/命令模式2.插入模式3.底行模式/末行模式4.视图模式5.替换模式 二.vim的基本操作1.进入vim&#xff1a;2.退出vim: 三.vim正常模式命令集1.光标定位&#xff1a;2.复制/粘贴3.撤销4.剪切/删除5. 更改 四.vim底行模式命令集1.保存/退出2.调出行号…

数据结构---树(Tree)

1. 简介 在数据结构中&#xff0c;树是一种层次结构的数据结构&#xff0c;由节点&#xff08;node&#xff09;组成&#xff0c;其中每个节点通过边&#xff08;edge&#xff09;与其他节点连接。树是一种非线性的数据结构&#xff0c;广泛用于表示具有层级关系的数据。常见的…

【unity】从零开始制作平台跳跃游戏--界面的认识,添加第一个角色!

在上一篇文章中&#xff0c;我们已经完成了unity的环境配置与安装⬇️ 【Unity】环境配置与安装-CSDN博客 接下来&#xff0c;让我们开始新建一个项目吧&#xff01; 新建项目 首先进入unityHub的项目页面&#xff0c;点击“新项目”&#xff1a; 我们这个系列将会以2D平台…