【C++ vector 类】

1. 标准库中的vector类

vector 类 的介绍:

注意:

1. vector是表示可变大小数组的序列容器。

2. 就像数组一样,vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是 一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大 小。

a. vector 的构造函数

代码举例1

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t;
}

代码举例2

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t(10,2); for (int i = 0; i < t.size(); i++){cout << t[i] << " ";}
}

运行结果:

代码举例3

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t(10,2); vector<int>t1(t);for (int i = 0; i < t.size(); i++){cout << t1[i] << " ";}
}

运行结果:

代码举例4

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t(10,2); vector<int>t1(t.begin(),t.end());for (int i = 0; i < t.size(); i++){cout << t1[i] << " ";}
}

运行结果:

b. vector iterator 的使用

  • begin + end ( begin : 获取第一个数据位置的iterator/const_iterator,end : 获取最后一个数据的下一个位置的iterator/const_iterator )

画图分析

  • rbegin + rend (rbegin : 获取最后一个数据位置的reverse_iterator , rend : 获取第一个数据前一个位置的 reverse_iterator )

画图分析

c. vector 空间增长问题

代码举例 (resize)

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t(10,2); t.resize(5); //缩容 , size 变小 , capacity 不变for (int i = 0; i < t.size(); i++){cout << t[i] << " ";}cout << endl;t.resize(10); //扩容 , size 变大 , 多余的默认赋值为 T(),这里是调用 int()// 注意 :在类的模板里面 ,允许内置类型也有自己的构造函数for (int i = 0; i < t.size(); i++){cout << t[i] << " ";}cout << endl;t.resize(15, 5);//扩容 , size 变大 , 多余的赋值为 5for (int i = 0; i < t.size(); i++){cout << t[i] << " ";}
}

运行结果:

d. vector 增删查改

代码举例1 (push_back)

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t;t.push_back(10);t.push_back(5);t.push_back(3);for (int i = 0; i < t.size(); i++){cout << t[i] << " ";}
}

运行结果:

代码举例2 (pop_back)

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t;t.push_back(10);t.push_back(5);t.push_back(3);t.pop_back();for (int i = 0; i < t.size(); i++){cout << t[i] << " ";}
}

运行结果:

代码举例3 (find) 

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t;t.push_back(10);t.push_back(5);t.push_back(3);t.pop_back();vector<int> :: iterator pos = find(t.begin(), t.end(), 5);cout << *pos << endl;
}

运行结果:

代码举例4 (insert)

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t;t.push_back(10);t.push_back(5);t.push_back(3);vector<int> :: iterator pos = find(t.begin(), t.end(), 5);t.insert(pos, 7);for (auto i : t){cout << i << " ";}
}

运行结果:

代码举例5 (erase)

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t;t.push_back(10);t.push_back(5);t.push_back(3);vector<int> :: iterator pos = find(t.begin(), t.end(), 5);t.erase(pos);for (auto i : t){cout << i << " ";}
}

运行结果:

代码举例6 (swap)

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> t;t.push_back(10);t.push_back(5);t.push_back(3);vector<int> t1(5,7);t.swap(t1);for (auto i : t){cout << i << " ";}cout << endl;for (auto i : t1){cout << i << " ";}
}

运行结果:

2. 迭代器失效

a. 概念

迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器, 程序可能会崩溃)

b. 对于vector可能会导致其迭代器失效的操作

1.  会引起其底层空间改变的操作(扩容),都有可能是迭代器失效

 如:push_back ,resize , reserve , insert

画图分析

具体详情配合看 vector 的实现

2.  指定位置元素的删除操作

如:erase

画图分析

具体详情配合看 vector 的实现

注意:

  1. vs 对于迭代器失效检查很严格,如使用了 erase 之后,之前的迭代器就不允许使用,只有重新给迭代器赋值,才可以继续使用
  2. Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端

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

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

相关文章

长度为n的数组a初始值全为0,目标是把数组a变为数组b(1<=bi<=n), 可以进行任意次操作:选择长度为k的数组c,(1<=ci<=n且两两不同)

对于1<i<k, 把 a[c[i]] 改为c[i % k 1]。给定n&#xff0c;k和数组b&#xff0c;判断能否得到数组b。 题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #d…

消息服务--Kafka的简介和使用

消息服务--Kafka的简介和使用 前言异步解耦削峰缓存1、消息队列2、kafka工作原理3、springBoot KafKa整合3.1 添加插件3.2 kafKa的自动配置类3.21 配置kafka地址3.22 如果需要发送对象配置kafka值的序列化器3.3 测试发送消息3.31 在发送测试消息的时候由于是开发环境中会遇到的…

STM32按键控制LED蜂鸣器光敏联动

GPIO输入模式下的硬件和电路 以下为不同类型传感器电路图 硬件电路讲解 上面两种接线方式表示按键按下时是低电平&#xff0c;下面两种接线方式表示按键按下时引脚是高电平默认使用上面两种方式比较多。 C语言知识回顾 不同的数据类型 &#xff1a; char short int long longl…

Linux(Ubuntu)中安装vscode

①首先去vscode的官网下载.deb文件 网址&#xff1a;https://code.visualstudio.com/docs/?dvlinuxarm64_deb 注&#xff1a;如果linux端无法打开网页下载文件&#xff0c;可以在Windows端下载好用WinSCP传输到Linux。下载前注意下你的系统架构是arm还是amd&#xff0c;系统…

AHU 数据库 实验五

【实验名称】 实验5 数据库的数据更新与视图管理 【实验目的】 1. 熟悉数据更新操作的概念与操作类型&#xff1b; 2. 熟练掌握INSERT、UPDATE、DELETE语句的基本语法&#xff1b; 3. 熟练运用INSERT、UPDATE、DELETE语句实现数据的插入、修改与删除…

CentOS/Fedora/Ubuntu/Debian 系统 wget 命令

wget 是云服务器安装环境和面板常用下载命令。下载软件或从远程服务器下载备份到本地服务器&#xff0c;也可以使用 wget 把文件下载到云服务器上。 VPS wget 命令最常用使用方法如下&#xff1a; 安装 wget 一般来说 wget 命令是系统自带的&#xff0c;方面安装环境和面板&…

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测 目录 多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 …

族群争霸休闲养成小游戏

​游戏概述&#xff1a; 在一个由自然力量支配的幻想世界中&#xff0c;狼族与羊族的战争永无止境。 人族在两者之间寻求和平&#xff0c;建立起坚固的城墙&#xff0c;同时捕捉狼与羊来增强自身实力。 神族则在幕后观察&#xff0c;偶尔以神技介入战场&#xff0c;影响战局…

复盘-word

word-大学生网络创业交流会 设置段落&#xff0c;段后行距才有分 word-选中左边几行字进行操作 按住alt键进行选中 word复制excel随excel改变&#xff08;选择性粘贴&#xff09; 页边距为普通页边距定义 ##### word 在内容控件里面填文字&#xff08;调属性&#xff09…

JavaScript使用

文章目录 一、JavaScript简介二、JavaScript引入方式1、内部脚本2、外部脚本 三、JavaScript基础语法1、书写语法&输出语句2、变量&数据类型3、运算符4、流程控制语句&函数 四、JavaScript对象1、Array2、String3、自定义对象 五、BOM1、Window2、History3、Locati…

扩展CArray类,增加Contain函数

CArray不包含查找类的函数&#xff0c;使用不便。考虑扩展CArray类&#xff0c;增加Contain函数&#xff0c;通过回调函数暴露数组元素的比较方法&#xff0c;由外部定义。该方法相对重载数组元素的“”符号更加灵活&#xff0c;可以根据需要配置不同的回调函数进行比较 //类型…

C语言————字符函数与字符串函数

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数&#xff0c;如追加&#xff0c;拷贝&#xff0c;替换等等接下来我们就学习⼀下这些函数&#xff0c;并且自实现。 gets 这个指令大家…

十七、enumerate函数的用法

enumerate() 函数是 Python 内置函数之一&#xff0c;用于同时返回可迭代对象的索引和对应的值。 它的语法结构如下&#xff1a; enumerate(iterable, start0) iterable: 表示一个可迭代的对象&#xff0c;如列表、元组、字符串等。start: 可选参数&#xff0c;表示索引起始…

校招春招秋招,HR是如何筛选简历的?

一份简历在HR的眼中最多能停留15秒钟。 如果15秒内HR没有决定要通知你做在线测评&#xff0c;那么这事就算过去了。 那么问题来了&#xff0c;如果在15秒内&#xff0c;让HR对你产生兴趣&#xff1f; 1、简历布局 人在浏览信息的时候&#xff0c;习惯性的是从上往下&…

The display: inline property prevents width from having an effect.

The display: inline property prevents width from having an effect. Try setting display to something other than inline. ---------------------------------- display: inline 不支持元素的 width 或 height 属性&#xff0c;若要元素 width 或 height 生效&#xff0c;…

全网上线 IP 归属地功能,一文教你如何实现

细心的朋友们可能已经发现了&#xff0c;先在抖音、知乎、快手、小红书等这些平台已经上线了“网络用户显示 IP 的功能”&#xff0c;境外用户显示的是国家&#xff0c;国内的用户显示的省份&#xff0c;而且此项显示无法关闭&#xff0c;归属地强制显示。 1获取用户 IP 地址 …

LLM 推理优化探微 (2) :Transformer 模型 KV 缓存技术详解

编者按&#xff1a;随着 LLM 赋能越来越多需要实时决策和响应的应用场景&#xff0c;以及用户体验不佳、成本过高、资源受限等问题的出现&#xff0c;大模型高效推理已成为一个重要的研究课题。为此&#xff0c;Baihai IDP 推出 Pierre Lienhart 的系列文章&#xff0c;从多个维…

企业如何安全参与开源项目?

【开源三句半】 企业参与开源潮&#xff0c; 安全创新都重要&#xff0c; 持续投入不可少&#xff0c; 眼光独到。 开源已经成为构建现代软件的常见方式&#xff0c;这不仅局限于IT技术本身&#xff0c;更推动了多个行业的数字化发展。企业决定引入开源项目打造商业软件时&…

简介:基于 OpenTiny 组件库的 rendereless 无渲染组件架构

在 HAE 自研阶段&#xff0c;我们实现的数据双向绑定、面向对象的 JS 库、配置式开发的注册表等特性&#xff0c;随着前端技术的高速发展现在已经失去存在的意义&#xff0c;但是在 AUI 阶段探索的新思路新架构&#xff0c;经过大量的业务落地验证&#xff0c;再次推动前端领域…

mmap匿名映射区

在创建映射区时&#xff0c;我们创建了一个文件&#xff0c;后面又需要unlink删除&#xff0c;然后munmap释放内存映射区&#xff0c;所以一开始就没必要创建。匿名映射区是指创建的映射区域不与任何文件关联&#xff0c;而是由操作系统分配的匿名内存。 mmap 内存映射里所谓的…