当前位置: 首页 > news >正文

c++ 容器 vector

vector的意思就是向量,就是一个顺序表的意思,这个顺序表可以存任意的类型,因为其线性的内存特点,所以在stl里是经常被使用的存在。

vector

vector既然要能储存任意的变量,那么就必须使用模板:

这里的T就是变量类型,Alloc是内存池,这里先不多介绍不是vector的重点,后面我单独提出来讲。

vector的成员变量

因为vector本质就是顺序表,所以它的成员变应该是一个指针,一个size,一个capacity,但是通过查阅stl的官方开源代码,发现是一下的一种成员形式:

这里我们看到源码里面将Ttypedef成了value_type 所以看到它就是类型变量名的意思,iterator就是对应的指针。

用start变量,即T*的指针来指向空间的开始,然后用finish变量来指向内容的结尾的下一个地址,用end_of_storage来指向存储空间的结尾的下一个地址:

vector的成员函数和相关的全局函数

构造、析构,赋值

首先讲的函数就是和构造相关的操作

构造函数

这里构造函数主要是默认构造,拷贝构造,带参构造,迭代器构造,初始值设定项列表构造,右值引用构造。这里的右值引用我先不讲,因为我还没学。后面补上,迭代器还有读者不清楚的可以看这一篇文章:c++迭代器介绍。

其中初始值设定项列表和右值引用是在c++11之后才有的。

默认构造

默认构造就是构造一个什么内容都没有的容器。

带参构造

带参构造支持:

写成函数就是这个样子。如果只写一个参数,那么就以T的默认构造的值来进行构造。这里要补充一下,为了让所有变量都支持T()这种写法,所以将所有的编译器自带的变量也支持的带参、默认了:

所以我们以int的vector为例:

拷贝构造

拷贝构造就是我们传一个预先构造好的同类型vector,让后创建和它相同值的vector出来:

其中的b和c都是拷贝构造。

迭代器构造

迭代器构造就是可以用一个容器的迭代器开始和结束来实现构造,那么它的优点就很明显,可以跨容器构造:

初始值设定项列表构造

这个可能对大家有点陌生,可以看看我的这一篇博客,详细介绍了它c++ 初始值设定项列表(initializer_list)-CSDN博客

那么这里就不多介绍,看一个例子就行了:

其他函数

迭代器类

不会迭代器的可以看这一篇:c++迭代器的介绍-CSDN博客

里面详细介绍了迭代器,这里就不多讲了,我在之前的string类里面也详细讲了迭代器,所有容器迭代器基本上都是这几个函数。具体不同都是因为内存的结构不一样导致的。只会少不会多。

容器内存操作类

有几个比较常见的我就不说了。提一下容易错的

max_size和capacity

max_size和capacity是不一样的,max_size是我们一直往后存n个数,能存的极限是多少,一般就是size_t类的-1。

capacity是一直往后存,不扩容的情况下能存的极限是多少,也就是当前new的内存的长度。

resize

就是你要增长就按对应的值增长

如果是长度比之前小,就是缩短,如果是增长,且你不穿第二个参数,就是用默认值增长,这里的默认值是T(),你传了就是用你的。

reserve

我们先看扩大:

发现它是属于绝对听从命令的

然后看缩小

我们发现,它绝对不缩容。

那么和string不一样的点就在扩容上面,string增长会根据1.5倍扩容来reserve ,假如你现在是64长度的capacity,那么你要扩到80,他会给你扩到96。

综上就是,扩容全听你的,缩容不听你的。

shrink_to_fit

这个也好说,强制缩容,让capacity=size

元素操作类

operator[]和at

作用都是一样的,只是一个断言,一个抛异常。

这个同back一样,返回对应点的引用。

data

data就是返回一个同类型的数组给你。

修改类

第一个就是重新初始化,对之前的数据进行覆盖:

相对于构造函数,少了拷贝,默认和右值引用。其他和对应的构造是一样的。

push_back,emplace_back功能上是一样的,但是emplace_back在某些场景下是比push_back快的。他们都是尾插。

pop_back就是尾删

 insert和emplace

insert第一个参数就是要插入的下标之前插入n个数,后面的参数和构造函数的传参为一不同的就是没有默认构造。

emplace和其实同样的功能

erase

erase有两个传参分别传开头和结尾的迭代器,如果不穿结尾迭代器默认全部删除
swap

swap相比于传统的swap来说,只是浅交换,将三个变量进行交换,因为传统的swap会创建中间变量。

clear

清除数据但是保留容量

非成员函数

逻辑运算符

swap

这里的swap是一个实例化函数,专门针对vector的,防止实例化了原版的swap。这个swap是调用vector类的swap函数。

vector的实现

有了顺序表的基础和string的基础,我们实现vector就是手拿把掐的事情:

相关文章:

c++ 容器 vector

vector的意思就是向量,就是一个顺序表的意思,这个顺序表可以存任意的类型,因为其线性的内存特点,所以在stl里是经常被使用的存在。 vector vector既然要能储存任意的变量,那么就必须使用模板: 这里的T就是变量类型&a…...

零基础部署Minecraft到云服务器上教程

零基础部署Minecraft到云服务器上教程 温馨提示 温馨提示 本教程是由博主个人飞书上直接复制下来,观感较差,请下载本教程对应的pdf资源文件进行查看(在最顶端,不过恳请各位留下一个赞再走吧)。本教程不包含云服务的购…...

常见cms漏洞之dedecms

DedeCMS是织梦团队开发PHP 网站管理系统,它以简单、易用、高效为特色,组建出各种各样各具特色的网站,如地方门户、行业门户、政府及企事业站点等。 下载地址请网上自行寻找 搭建方式选择php study 首先搭建环境 #前台http://localhost/dedecm…...

深入探究Liunx服务器内存:模拟程序实际占用与缓存占用内存

文章目录 深入探究Liunx服务器内存:模拟程序实际占用与缓存占用内存实际内存占用:使用 memtester安装 memtester下载和编译安装 memtester 使用 memtester 缓存占用:使用虚拟内存构造内存消耗创建虚拟内存目录挂载虚拟内存创建大文件以消耗内…...

《Milvus Cloud向量数据库指南》——Zilliz Cloud 高可用性深度解析:赋能GenAI应用,引领非结构化数据新纪元

在人工智能与大数据技术日新月异的今天,非结构化数据的处理与分析已成为推动行业智能化转型的关键驱动力。Zilliz Cloud,作为基于开源向量数据库Milvus构建的全托管解决方案,不仅革新了非结构化数据的存储与查询方式,更以其卓越的高可用性设计,为开发人员构建高效、可靠的…...

2024/8/4 维高-STD60N驱动器(伺服)---客户反馈:电机异响

步进电机 MHS1A86-60B85B ,额定电流6A 步骤一:设置额定电流 std60n驱动器拔码全部为off(后台设置),伺服后台连上后设置h00-11按电机铭牌进行 设置下额定电流 步骤二:最好设置峰值电流一…...

驾驭RESTful海洋:在PyCharm中配置和使用REST客户端全攻略

标题:驾驭RESTful海洋:在PyCharm中配置和使用REST客户端全攻略 引言 在当今的软件开发中,REST(Representational State Transfer)API已成为前后端分离架构的核心组成部分。PyCharm,作为业界领先的集成开发…...

策略模式的一次应用

项目的需求是将一组图像按照相似度分类。 采用了模板匹配计算相似度的实现方式。 #include <opencv2/core.hpp> #include <openev2/core/utility.hpp> #include <opencv2/highqui.hpp> #include <openav2/imgproc.hpp> cv::Mat image matched; double …...

探索PyCharm的C/C++支持:一站式配置指南

探索PyCharm的C/C支持&#xff1a;一站式配置指南 引言 PyCharm&#xff0c;作为JetBrains家族中的一个强大IDE&#xff0c;以其对Python的卓越支持而闻名。然而&#xff0c;PyCharm的多语言支持同样不容小觑。本文将带领你了解如何在PyCharm中配置C/C环境&#xff0c;让你在…...

手机三要素接口怎么对接呢?(一)

一、什么是手机三要素&#xff1f; 手机三要素又叫运营商三要素&#xff0c;运营商实名认证&#xff0c;运营商实名核验&#xff0c;手机三要素实名验证&#xff0c;手机三要素实名核验&#xff0c;每个人的称呼都不同&#xff0c;但是入参和出参是一样的。 输入姓名、身份证…...

状态同步帧同步

帧同步&#xff1a; 有明确的逻辑帧概念&#xff0c;按照固定的逻辑帧间隔同步帧数据 原理 锁帧&#xff1a;mmo那种游戏&#xff0c;服务器需要收到第k帧所有客户端的指令&#xff0c;就算没有操作也发个空指令上去&#xff08;相对来说回合制卡牌这类就简单很多&#xff0…...

Flink 开发语言选择 —— Java vs Scala

引言 Apache Flink 是一个用于处理无界和有界数据流的开源分布式计算框架。随着 Flink 的日益流行&#xff0c;越来越多的开发者开始考虑使用哪种编程语言来进行 Flink 应用程序的开发。本文将探讨在 Flink 中使用 Java 和 Scala 的优缺点&#xff0c;并帮助你做出更明智的选择…...

如何在 Apache Web 服务器中安装、配置和使用模块

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 ## 状态&#xff1a;已弃用本文涵盖的是不再受支持的 Ubuntu 版本。如果您目前正在运行 Ubuntu 12.04 服务器&#xff0c;我们强烈建议升…...

海信聚好看的DBDocter软件使用心得

在墨天轮大会看到这个软件,好称是内核级别的诊断工具, 工作空闲下载免费看看 结果要1.7GB还TAR. DBdoctor是一款内核级数据库性能诊断软件。可以对数据库做细粒度的扫描&#xff0c;帮助您一分钟内找到数据库性能问题&#xff0c;实现性能诊断百倍提效。针对数据库性能诊断门…...

dfs深搜

Problem - C - Codeforces 无向图,判断是否是子叶....

【React】详解 index.js 文件

文章目录 一、index.js文件的基本结构1. 引入必要的模块2. 渲染根组件3. 注册服务工作者&#xff08;可选&#xff09; 二、index.js文件的详细解析1. ReactDOM.render的作用2. 为什么使用React.StrictMode3. 服务工作者的注册 三、index.js文件的最佳实践1. 使用模块化引入2. …...

Android NDK/JNI面试题大全及参考答案(3万字长文)

目录 什么是NDK?它主要用来做什么? 为什么在Android开发中使用NDK? 描述一下NDK和JDK之间的关系 举出一些使用NDK开发的应用场景 什么是JNI?它如何与NDK配合使用? 如何安装和配置Android NDK? 在Android Studio中如何配置NDK路径? 描述一下NDK工具链中的主要工具…...

从根儿上学习spring一 之杂谈

相信学做Java开发的同学从开始工作时就被问及什么是spring的依赖注入&#xff0c;以及切面编程。今天我们简单再聊聊这两个概念。 依赖注入 这里的依赖不是动词依赖依靠的意思&#xff0c;而是名词。可以把这两个词翻过来读下”注入依赖“&#xff0c;所谓的依赖可以理解成一…...

AI智能名片小程序在促销性内容营销中的创新应用与策略分析

摘要&#xff1a;在数字化时代&#xff0c;企业营销手段日益丰富多元&#xff0c;促销性内容作为吸引顾客、促进消费的关键手段之一&#xff0c;其形式与效率不断被革新。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI智能名片小程序作为一种新兴的营销…...

13. 罗马数字转整数【 力扣(LeetCode) 】

一、题目描述 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符数值字符数值I1V5X10L50C100D500M1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1 。12 写做 XII &#xff0c;即为 X…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

spring boot使用HttpServletResponse实现sse后端流式输出消息

1.以前只是看过SSE的相关文章&#xff0c;没有具体实践&#xff0c;这次接入AI大模型使用到了流式输出&#xff0c;涉及到给前端流式返回&#xff0c;所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...