c++ 容器 vector

news2024/9/30 4:55:02

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就是手拿把掐的事情:

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

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

相关文章

【QT】鼠标按键事件 - QMouseEvent QKeyEvent

qt 事件 事件1. 事件概念2. 事件的处理3. 按键事件(1)单个按键(2)组合按键 4. 鼠标事件(1)鼠标单击事件(2)鼠标释放事件(3)鼠标双击事件(4&#x…

【多线程-从零开始-叁】线程的核心操作

一、创建一个线程-start() start 和 run 的区别:(经典面试题) run 描述了线程要执行的任务,也可以称为“线程的入口”此处 start 会根据不同的系统,分别调用不同的 API,来执行系统函数,在系统…

原生多模态跟GPT聊天部分测试,大家都用他来做什么;字节推出AI音乐产品-海绵音乐,可以媲美Udio和Suno

✨ 1: 跟GPT聊天 原生多模态跟GPT聊天部分测试,大家都用他来做什么。 说各个国家的语言,例如普通话,或者是广东话等。 ChatGPT担任富有激情的足球比赛解说员 使用新的高级语音模式 视觉,进行实时日语翻译! 地址&…

Java编程规范 空格

public static void main(String[] args) { // 缩进4 个空格 String say "hello"; // 运算符的左右必须有一个空格 int flag 0; // 关键词if 与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格 if (flag 0) { System…

秃姐学AI系列之:模型选择 | 欠拟合和过拟合 | 权重衰退

目录 训练误差 泛化误差 验证数据集和测试数据集 验证数据集 Validation Dataset: 测试数据集: K-则交叉验证 总结 过拟合和欠拟合 模型容量 模型容量的影响 估计模型容量 数据复杂度 总结 权重衰退 weight decay 使用均方范数作为硬性…

【八】Zookeeper3.7.1集成Hadoop3.3.4集群安装

文章目录 1.基本原理2.下载并解压ZooKeeper3.配置环境变量4.配置ZooKeeper5.创建数据目录并初始化myid6.启动ZooKeeper7.配置ZooKeeper集成到Hadoop8.重启Hadoop9.ZooKeeper状态检查 1.基本原理 ZooKeeper 是一个分布式协调服务,用于分布式系统中管理配置信息、命名…

51单片机—智能垃圾桶(定时器)

一. 定时器 1. 简介 C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器或者计数器使用。 确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每…

vue3 手写日历组件

找了很久vue3的element样式一直没办法修改实现。只能手写日历了。借鉴了一些大佬的代码 调用&#xff1a; 再要使用的地方引入 import calendarelement from ./calendarelement.vue //日历组件 <div > <calendarelement /> //日历</div> 效果&#…

押金原路退回系统在医院中应用,一键操作秒到账 押金+身份证+电子押金单

一、医院押金管理必要性 保障医疗服务的连续性&#xff1a;患者缴纳押金能够确保在治疗过程中&#xff0c;医院有足够的资金来提供必要的医疗服务、药品和设备&#xff0c;不会因为费用问题而中断治疗。例如&#xff0c;在紧急手术或需要持续使用昂贵药物的情况下&#xff0c;…

【Vue3】组件通信之$attrs

【Vue3】组件通信之$attrs 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

开发在线客服系统新的宣传推广站【微客客服】

打造一个软件宣传官网&#xff0c;这事儿可不简单。咱们得先搞清楚&#xff0c;这个网站要给谁看&#xff0c;要传达啥信息&#xff0c;需要哪些功能。 我们网站是宣传【在线客服系统】的&#xff0c;所以需要把主要功能展示清楚 在线网址&#xff1a;https://weikefu.com.cn 然…

Python面试宝典第27题:全排列

题目 给定一个不含重复数字的数组nums&#xff0c;返回其所有可能的全排列 。备注&#xff1a;可以按任意顺序返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 示例 2&#xff1a; 输…

Qt之Gui

组件依赖关系 应用 #mermaid-svg-GADicZtZJRVVUeiF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GADicZtZJRVVUeiF .error-icon{fill:#552222;}#mermaid-svg-GADicZtZJRVVUeiF .error-text{fill:#552222;stroke:#…

【Spark计算引擎----第三篇(RDD)---《深入理解 RDD:依赖、Spark 流程、Shuffle 与缓存》】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索大数据技术Spark—RDD&#xff0c;本篇文章主要讲述了&#xff1a;RDD的依赖、Spark 流程、Shuffle 与缓存等等。欢迎大家一起探索讨论&#xff01;&#xff0…

【Gold菜鸟】Linux知识回忆(8)——进程和计划任务

前言 这部分让我们来继续了解Linux中进程和计划任务的相关知识吧~ 相关技术交流欢迎添加VX: wenjinworkon 目录 进程和内存管理 什么是进程 进程结构 进程相关概念 物理地址空间和虚拟地址空间 用户和内核空间 进程使用内存问题 进程状态 内存淘汰数据机制&#xff1a;…

数学建模评价类—Topsis法

目录 文章目录 前言 切记&#xff1a;以下内容仅用于参考理解&#xff0c;不可用于数模竞赛&#xff01;&#xff01;&#xff01; 一、Topsis的基本原理 二、Topsis的建模过程 1.判断矩阵是否需要正向化 2.原始矩阵正向化 3.矩阵标准化 4.计算距离&#xff0c;给出得…

Can Large Language Models Provide Feedback to Students? A Case Study on ChatGPT

文章目录 题目摘要相关工作方法结果讨论意义 题目 大型语言模型能为学生提供反馈吗&#xff1f;ChatGPT 案例研究 论文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/10260740 摘要 摘要——教育反馈已被广泛认为是提高学生学习能力的有效方法。然而&#x…

Python | Leetcode Python题解之第322题零钱兑换

题目&#xff1a; 题解&#xff1a; class Solution:def coinChange(self, coins: List[int], amount: int) -> int:dp [float(inf)] * (amount 1)dp[0] 0for coin in coins:for x in range(coin, amount 1):dp[x] min(dp[x], dp[x - coin] 1)return dp[amount] if d…

Python的if语句及其运用

一、条件测试 每条if语句的核心都是一个值为True或False的表达式&#xff0c;这种表达式称为条件测试。如果测试的条件满足if语句则为True&#xff0c;接着执行if里的语句&#xff1b;如果测试的条件不满足if语句则为False&#xff0c;则不执行if里的语句。 1.1、检查是否相等…

C++ | Leetcode C++题解之第322题零钱兑换

题目&#xff1a; 题解&#xff1a; class Solution { public:int coinChange(vector<int>& coins, int amount) {int Max amount 1;vector<int> dp(amount 1, Max);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < (int)coins.size();…