C++STL--------vector

news2025/1/9 14:30:00

文章目录

    • 一、vector常用接口介绍
        • 1、initializer_list
        • 2、接口有很多类似
        • 3、typeid(类型).name()
        • 4、find() 函数
        • 5、内置类型构造
    • 二、vector()常用接口模拟实现

截图来源网站:https://legacy.cplusplus.com/reference/vector/vector/

一、vector常用接口介绍

在这里插入图片描述
是一个类模版,可以创建各种类型的数组。

1、initializer_list

在这里插入图片描述
可以支持初始化多个数据

	//initializer_list可以实现大括号初始化
	vector<int> v1 = { 1,2,3,4,5 };
	vector<int> v2({ 1,2,3,4,5 });
	
	//可以遍历无法修改
	auto i1 = { 1,2,3,4,5 };
	initializer_list<int> i2 = { 1,2,3,4,5 };

	//类似这个数组
	int a[] = { 1,2,3,4,5 };
2、接口有很多类似
  • size() 获取有效数据个数
  • begin() , end() 迭代器
  • capacity()空间大小
  • empty()判段是否为空
  • reserve()对空间进行扩容
  • resize()对有效数据进行调整,一般空间不够会扩容,但不会缩容空间
  • shrink_to_fit()对空间缩容跟size一样大小
  • operator[]越界是直接断言
  • at()越界是抛异常
  • date()返回底层数组的指针
  • assign()是一直赋值,会覆盖原来的数据,空间不够会扩容
  • push_back()区别是只能单个数据的插入
  • insert()插入数据但不支持下标的插入,支持迭代器区间
  • erase()删除一个值这个值的位置是迭代器,删除一端迭代器区间
  • swap()交换
  • emplace()跟insert()功能一样
  • emplace_back()跟push_back()功能一样,有的场景效率更高
3、typeid(类型).name()

可以拿到一个真实的类型

在这里插入图片描述
vector里面的迭代器可以看到实现的很复杂

4、find() 函数

不是vector的函数成员,是库里面的一个通用函数模版
在这里插入图片描述
给段段左闭右开的迭代器区间寻找指定的值,找到返回对应位置的迭代器,没找到返回last迭代器

5、内置类型构造

C++对内置类型也进行了升级

	int i = int();
	int k = int(10);
	int j(100);

二、vector()常用接口模拟实现

#pragma once


#include <iostream>
#include <assert.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <initializer_list>
#include <string>
 
namespace lsh
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;

		typedef const T* const_iterator;

		iterator begin()
		{
			return _start;
		}

		const_iterator begin() const
		{
			return _start;
		}

		iterator end()
		{
			return _finish;
		}

		const_iterator end() const
		{
			return _finish;
		}

		vector()
			:_start(nullptr)
			,_finish(nullptr)
			,_end_of_storage(nullptr)
		{}

		vector(std::initializer_list<T> li)
			:_start(nullptr)
			, _finish(nullptr)
			, _end_of_storage(nullptr)
		{
			reserve(li.size());
			for (auto& c : li)
			{
				push_back(c);
			}
		}

		vector(const vector<T>& v)
		{
			reserve(v.capacity());
			for (auto& c : v)
			{
				push_back(c);
			}
		}

		template<class InputIterator>
		vector(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				push_back(*first);
				first++;
			}
		}

		vector(size_t n, T val = T())
		{
			reserve(n);
			for (size_t i = 0; i < n; i++)
			{
				push_back(val);
			}
		}

		vector(int n, T val = T())
		{
			reserve(n);
			for (size_t i = 0; i < n; i++)
			{
				push_back(val);
			}
		}

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

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

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

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

		void reserve(size_t n)
		{
			size_t s = size();
			if (n > capacity())
			{
 				T* tmp = new T[n];
				if (_start)
				{
					for (int i = 0; i < s; i++)
					{
						tmp[i] = _start[i];
					}
					delete [] _start;
				}
				_start = tmp;
				_finish = _start + s;

				_end_of_storage = _start + n;
			}
		}

		void push_back(const T& x)
		{
			if (_finish == _end_of_storage)
			{
				reserve(capacity() == 0 ? 4 : capacity() * 2);
			}
			*_finish = x;
			++_finish;
		}

		void swap(vector<T> v)
		{
			std::swap(_start, v._start);
			std::swap(_finish, v._finish);
			std::swap(_end_of_storage, v._end_of_storage);
		}

		vector<T>& operator=(vector<T> v)
		{
			swap(v);
			return *this;
		}

		T& operator[](size_t n)
		{
			assert(n < size());

			return _start[n];
		}

		const T& operator[](size_t n) const
		{
			assert(n < size());

			return _start[n];
		}

		bool empty()
		{
			return _start == _finish;
		}

		void pop_back()
		{
			assert(_finish > _start);
			--_finish;
		}

		//存在迭代器失效,要返回更新后的迭代器
		iterator insert(iterator pos, const T& x)
		{
			assert(pos >= _start && pos <= _finish);
			if (_finish == _end_of_storage)
			{
				int n = pos - _start;
				reserve(capacity() == 0 ? 4 : capacity() * 2);
				pos = _start + n;
			}
			iterator i = _finish;
			while (i > pos)
			{
				*i = *(i-1);
				i--;
			}
			*pos = x;
			++_finish;

			return pos;
		}

		iterator erase(iterator pos)
		{
			assert(pos >= _start && pos < _finish);
			iterator i = pos;
			while (i < _finish -1)
			{
				*i = *(i + 1);
				i++;
			}
			--_finish;
			return pos;
		}

	private:
		iterator _start = nullptr;
		iterator _finish = nullptr;
		iterator _end_of_storage = nullptr;
	};
}


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构设计笔记-8-系统质量属性与架构评估

目录 知识要点 案例分析 1.质量属性 2.非功能性需求 3.质量属性效用树&#xff0c;风险点/敏感点/权衡点&#xff0c;设计策略 4.管道过滤器/仓库风格&#xff0c;质量属性 5.质量属性效用树 6.质量属性 7.质量属性效用树 8.质量属性效用树&#xff0c;风险点/敏感点…

架构师备考-背诵精华(架构开发方法)

软件架构风格 类型 子类型 说明 数据流风格 批处理 每个处理步骤是一个单独的程序&#xff0c;每一步必须在前一步结束后才能开始&#xff0c;而且数据必须是完整的&#xff0c;以整体的方式传递。 管道过滤器 把系统分解为几个序贯的处理步骤&#xff0c;这些步骤之间…

目标检测系统【环境详细配置过程】(CPU版本)

&#xff08;如果你使用的是笔记本电脑&#xff0c;没有比较好的GPU&#xff0c;可以配置CPU运行环境&#xff09; 链接&#xff1a;上百种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09; 1.安装…

leetcode热题100.编辑距离

题目 72. 编辑距离 - 力扣&#xff08;LeetCode&#xff09; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输…

Spring Web MVC快速入门:掌握Java Web开发基础

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:桃李春风一杯酒&#xff0c;江湖夜雨十年灯&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4…

基于Arduino的红外遥控智能小车实现方法

一、简介 使用红外遥控器实现智能小车前进、后退、左转、右转、停止运动五种动作。 二、控制方法 使用红外遥控器遥控智能小车运行之前&#xff0c;需要使用红外线接收电路来读取红外线遥控器的按键代码&#xff0c;将获取的按键代码定义为控制智能小车前进、后退、左转、右…

Web Socket 使用详解

在信息爆炸的时代&#xff0c;用户对网页的期待早已超越了静态内容的展示。实时聊天、股票报价、协同编辑等功能的实现&#xff0c;都离不开服务器与客户端之间持续、高效的数据交互。传统的HTTP请求-响应模型难以满足这种需求&#xff0c;而WebSocket的出现&#xff0c;为构建…

个人健康系统|个人健康数据管理系统|基于小程序+java的个人健康数据管理系统设计与实现(源码+数据库+文档)

个人健康数据管理系统 目录 基于小程序java的个人健康数据管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

C语言刷题 LeetCode 删除单链表的重复节点 双指针法

题目要求 链表结构&#xff1a;题目中提到的是未排序的链表&#xff0c;链表是由一系列节点组成的&#xff0c;每个节点包含一个值&#xff08;数据&#xff09;和一个指向下一个节点的指针。去重&#xff1a;我们需要遍历链表&#xff0c;删除所有重复的节点&#xff0c;只保…

开源新生活,社区齐乐活:COSCon'24 社区合作和开源集市招募中,诚邀广大社区参与!...

一年一度的开源盛会&#xff0c;COSCon24第九届中国开源年会暨开源社10周年嘉年华&#xff0c;将于11月2-3日&#xff0c;在北京•中关村国家自主创新示范区展示中心召开&#xff01;本次大会的主题是&#xff1a;「Open Source&#xff0c;Open Life | 开源新生活」&#xff0…

react antd redux 全局状态管理 解决修改菜单状态 同步刷新左侧菜单

npm i react-redux1.src新建两个文件 globalState.js 全局状态定义 store.js 全局存储定义 2.globalState.js import { createSlice } from "reduxjs/toolkit";export const globalState createSlice({name: "globalState",initialState: { data: {} },r…

Qt 学习第 天:QPainter类

一、先创建一个widget窗口 二、包含头文件 #include <QPainter> #include <QFont> 三、在widget.h中声明paintEvent函数 使用画家类在窗口中画图, 操作必须在paintEvent函数中完成 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { cla…

Spring Boot框架下的知识管理自动化

3系统分析 3.1可行性分析 通过对本知识管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本知识管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

C语言题目练习3

这一篇博客也来看看和链表有关的题目~ 反转链表 反转链表&#xff1a; https://leetcode.cn/problems/reverse-linked-list/description/ 这个题目已经十分清晰了&#xff0c;那我们可以怎么做呢&#xff1f; 结合前面单链表的知识点&#xff0c;我们很容易可以想到第一个思路…

RTC -

RTC 目录 RTC 回顾 RTC 如何实现RTC制作一个时钟日历 代码编写 rtc.c完整代码 模块开发的步骤&#xff1a; 1、找文档 2、 在文档里面找通信方式&#xff0c;通信过程&#xff08;协议&#xff09; 3、代码> -- 前面学的是模块的开发&#xff0c;串口类&#xff0c;I…

决策树和集成学习的概念以及部分推导

一、决策树 1、概述 决策树是一种树形结构&#xff0c;树中每个内部节点表示一个特征上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff0c;每个叶子节点代表一种分类结果 决策树的建立过程&#xff1a; 特征选择&#xff1a;选择有较强分类能力的特征决策树生成…

【论文阅读】SRCNN

学习资料 论文题目&#xff1a;Learning a Deep Convolutional Network for Image Super-Resolution&#xff08;学习深度卷积网络用于图像超分辨率&#xff09;论文地址&#xff1a;link.springer.com/content/pdf/10.1007/978-3-319-10593-2_13.pdf代码&#xff1a;作者提出的…

Java 一维数组作为函数参数

//一维数组的引用 #define SIZE 5 void input(int a[], int len); void output(int a[], int len);//函数的声明 int main(void) { int i 0; int arr[SIZE] { 86,85,85,896,45 };//同理五个数据只是偶然&#xff0c;可能会更多 //输入 input(arr, SIZE); …

目标检测系统操作说明【用户使用指南】(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

1.链接&#xff1a;上百种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09; 2.目标检测系统【环境搭建过程】&#xff08;GPU版本&#xff09; 3.目标检测系统【环境详细配置过程】&#xff08;CP…

241012-绿联UGOSPro-在仅无线WLAN网络条件下添加虚拟机网络

A. 新建NAT模式的虚拟子网 虚拟机-管理-网络管理-添加网络-如下设置 B. 虚拟机网络选择 C. 不同网络的对比 support.ugnas.com Virtio、e1000和rtl8139有什么区别&#xff0c;在创建虚拟机时&#xff0c;我应该如何选择&#xff1f; Virtio、e1000和rtl8139是三种不同的虚拟…