C++:vector 定义,用法,作用,注意点

C++ 中的 vector 是标准模板库(STL)提供的一种动态数组容器,它提供了一组强大的方法来管理和操作可变大小的数组。以下是关于 vector 的定义、用法、作用以及一些注意点:

定义: 要使用 vector,首先需要包含 <vector> 头文件,并使用命名空间 std。例如:

#include <vector>
using namespace std;

然后可以声明一个 vector 对象,可以存储各种数据类型的元素,例如整数、浮点数、对象等。例如:

vector<int> myVector; // 创建一个整数类型的空向量

用法: vector 提供了一系列方法来添加、删除、访问和操作元素,其中包括:

  • push_back(value):将元素添加到向量的末尾。
  • pop_back():删除向量的末尾元素。
  • at(index):访问指定索引位置的元素。
  • size():返回向量的大小(元素个数)。
  • empty():检查向量是否为空。
  • clear():清空向量中的所有元素。

还有其他方法,如 inserteraseresize 等,可以更灵活地操作 vector

作用: vector 的主要作用是提供一个动态大小的数组,可以在运行时动态地添加或删除元素。这使得它非常适合需要管理不定数量元素的情况,而无需手动管理内存。

注意点: 在使用 vector 时需要注意以下几点:

  1. 性能开销: 在向 vector 中添加或删除元素时,可能需要重新分配内存,因此在频繁插入或删除元素时,可能会有性能开销。可以使用 reserve 方法提前分配一定大小的内存,以减少重新分配的次数。

  2. 迭代器失效: 当向 vector 中插入或删除元素时,迭代器(iterator)可能会失效,因此要小心在迭代过程中修改 vector

  3. 内存管理: vector 会自动处理内存管理,但要确保在不需要使用时及时销毁对象,以防止内存泄漏。

  4. 元素访问: 使用 at(index) 方法访问元素时,要确保索引在有效范围内,否则会触发越界错误。

  5. 元素类型: vector 必须包含相同类型的元素,不能混合不同类型。

总之,vector 是一个强大的动态数组容器,可以方便地管理动态大小的数据集合。但要注意性能和安全性方面的考虑,以确保代码的正确性和效率。

下面是一个简单的 vector 示例代码,以及一些常见的错误用法和分析:

#include <iostream>
#include <vector>using namespace std;int main() {// 创建一个整数类型的vector并初始化vector<int> myVector;myVector.push_back(1);myVector.push_back(2);myVector.push_back(3);// 访问和输出vector中的元素cout << "Vector elements:";for (int i = 0; i < myVector.size(); ++i) {cout << " " << myVector[i];}cout << endl;// 错误用法示例:// 1. 访问越界// myVector[5] = 10; // 这会导致访问越界错误// 2. 使用错误的类型// myVector.push_back("hello"); // 这会导致类型不匹配错误// 3. 迭代器失效// for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {//     if (*it == 2) {//         myVector.erase(it); // 这会导致迭代器失效//     }// }return 0;
}

在上述代码中,首先创建了一个整数类型的 vector,并初始化了一些元素。然后,使用循环访问并输出 vector 中的元素。

接下来,示例了一些错误用法及其分析:

  1. 访问越界: 如果尝试访问 vector 中不存在的索引(如 myVector[5]),会导致访问越界错误,可能导致程序崩溃或不可预测的行为。

  2. 使用错误的类型: 如果尝试将不同类型的元素添加到 vector 中(如 myVector.push_back("hello"),其中 "hello" 是字符串而不是整数),会导致类型不匹配错误。

  3. 迭代器失效: 在迭代 vector 时,如果在迭代过程中修改了 vector 的大小(例如使用 erase 删除元素),迭代器会失效,导致未定义的行为。上面的示例代码中的注释部分演示了这一点。

正确使用 vector 需要注意这些潜在的错误,以确保代码的健壮性和正确性。在生产环境中,可以考虑使用更安全的方法,如使用范围循环(range-based loop)或迭代器遍历 vector,以避免迭代器失效问题。

如何理解迭代器失效?

理解迭代器失效(Iterator Invalidation)是在使用C++容器(如vectorlistmap等)时非常重要的概念。迭代器是一种用于遍历容器元素的对象,类似于指针,它指向容器中的一个特定元素。当容器发生结构性变化(例如插入、删除元素)时,迭代器可能会失效,意味着它们不再指向有效的元素或已经被释放,因此进一步使用这些失效的迭代器可能导致未定义的行为或崩溃。

以下是一些常见的导致迭代器失效的操作和情况:

  1. 插入和删除元素: 当向容器中插入或删除元素时,容器内的元素可能需要重新分配内存以适应新的大小,这会导致现有迭代器指向的元素位置不再有效。例如,在vector中使用push_backerase操作可能会导致迭代器失效。

  2. 改变容器大小: 调用像resize这样的方法会更改容器的大小,这可能会导致迭代器失效。

  3. 使用非常量迭代器: 如果你使用了非常量迭代器(例如vector<int>::iterator),并且在遍历过程中修改了容器的元素,那么迭代器可能会失效。这是因为非常量迭代器允许修改元素,但这可能会导致容器重新分配内存,从而使迭代器失效。

  4. 删除或插入容器之外的元素: 如果你删除或插入容器之外的元素(例如在map中),则可能导致相关迭代器失效。

  5. 复制或赋值容器: 在复制或赋值容器时,新容器的迭代器不再与原容器的迭代器相互关联,因此不能将原容器的迭代器用于新容器。

为了避免迭代器失效,可以考虑以下方法:

  • 使用范围循环(range-based loop):范围循环是一种简化遍历容器的方法,它可以避免使用显式迭代器。

  • 使用常量迭代器:如果不需要修改容器中的元素,可以使用常量迭代器(例如vector<int>::const_iterator)来确保容器不会在遍历过程中被修改。

  • 使用合适的迭代器:如果需要修改容器,确保在修改期间不会发生容器大小的变化。此外,可以使用eraseinsert等方法返回的新迭代器,以确保它们仍然有效。

总之,理解和注意迭代器失效是编写安全和健壮的C++代码的关键,特别是在涉及到容器操作时。选择合适的迭代器类型以及避免在遍历过程中修改容器可以帮助减少迭代器失效的风险。

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

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

相关文章

四、YApi的安装和配置

YApi是去哪儿网的前端技术中心的一个开源可视化接口管理平台。 创建接口项目 创建接口 编写接口

常用中间件-OAuth2

1. 微服务权限校验Session共享 1.1 微服务权限校验 实现2号方案。使用Redis作为Session统一存储。 首先配置一下Nacos&#xff0c;参考https://blog.csdn.net/weixin_43917045/article/details/132852850 然后为每个服务添加验证机制&#xff0c;先导入依赖 <!-- SpringS…

富贵包 与 大椎穴

富贵包是什么 富贵包是指在后项与背交界处的脂肪堆积&#xff0c;形成一个包块样凸起&#xff0c;通俗来讲就是大椎穴气血运行不畅&#xff0c;淤堵增生的产物。 富贵包多出现在肥胖人群中&#xff0c;与经常低头玩手机、看书或低头办公的人群有关&#xff0c;导致这个部位血运…

如何配置代理

打开Clask&#xff0c;设置为系统代理&#xff0c;选择规则判断&#xff0c;规则判断就是需要走代理的走代理&#xff0c;不需要走的就不用走代理 本地使用代理 如何想要让某个地方使用代理&#xff0c;可以直接在该地方的终端进行设置 先复制一下终端代理命令&#xff0c;然…

Redis key基本使用

查看key的数据类型 string 、hash等 type key 查看key是否存在 exist key1 查看key的有效期 -1&#xff1a;永不过期 -2&#xff1a;已过期 设置key过期时间 expire key seconds expireat key 日期 key移动到其它库 move key index redis 默认是16个库 0,1,2,…15 切换数据库【…

FPGA的数字钟带校时闹钟报时功能VHDL

名称&#xff1a;基于FPGA的数字钟具有校时闹钟报时功能 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 1、计时功能:这是数字钟设计的基本功能&#xff0c;每秒钟更新一次,并且能在显示屏上显示当前的时间。 2、闹钟功能:如果当前的时间与闹钟设置的时…

爬虫,初学者指南

第一篇&#xff1a;爬虫入门request模块的基本使用以www.douban.com为例 get请求&#xff1a; # 查看响应数据&#xff0c;返回的是Unicode格式的数据 print(response.text)# # 查看响应数据&#xff0c;返回的是字节流数据&#xff08;图片视频等&#xff09; print(response…

redis常用操作命令

日升时奋斗&#xff0c;日落时自省 注&#xff1a;命令区分有点细&#xff0c;择取自己需要的即可 目录 1、单机架构 2、数据库和应用分离 3、分布式基本概念 3.1、应用&#xff08;Application&#xff09;/系统(System) 3.2、模块&#xff08;Module&#xff09;/组件&…

本地搭建kafka并用java实现发送消费消息

1、下载kafka的jar包文件 https://www.apache.org/dyn/closer.cgi?path/kafka/3.1.0/kafka_2.12-3.1.0.tgz2、下载完成直接操作命令启动 1、打开新的terminal(终端)窗口&#xff0c;进入kafka的bin目录 启动zk./zookeeper-server-start.sh ../config/zookeeper.properties2、…

ubuntu 20 安装 CUDA

1. 查看需要安装的cuda版本 nvidia-smi cuda的版本信息如下图所示 2. 去官网下载对应版本的CUDA 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 弹出以下界面&#xff0c;依次点击以下按钮 得到以下内容&#xff1a; 复制下载链接&#xff0c;下载cuda11到本…

现代数据架构-湖仓一体

当前的数据架构已经从数据库、数据仓库&#xff0c;发展到了数据湖、湖仓一体架构&#xff0c;本篇文章从头梳理了一下数据行业发展的脉络。 上世纪&#xff0c;最早出现了关系型数据库&#xff0c;也就是DBMS&#xff0c;有商业的Oracle、 IBM的DB2、Sybase、Informix、 微软…

【CTFHUB】SSRF绕过方法之靶场实践(二)

SSRF POST请求 提示信息&#xff1a; 这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年 首先测试了http的服务请求&#xff0c;出现对话框 输入数值后提示&#xff1a;只能接受来自127.0.0.1的请求 右键查看源码发现key值 通过file协…

destoon根据查询标题小于5个字符的数据进行删除

最近客户有个需求&#xff0c;就是他采集的时候&#xff0c;标题有些小于5字符的短标题的垃圾数据&#xff0c;进行清空处理&#xff0c;让我进行批量删除。废话不多说&#xff0c;接着干。 首先在dt根目录新建delmysql.php文件&#xff0c;代码如下&#xff1a; <?php r…

Armv9读取cache内容:Direct access to internal memory

10 访问cache Cortex-A720核心提供一种机制,通过IMPLEMENTATION DEFINED系统寄存器可以读取L1缓存、L2缓存和Translation Lookaside Buffer(TLB)。当缓存数据与系统内存数据之间的一致性异常时,您可以使用此机制来调查任何问题。 只有在EL3中才可以访问内部内存(cache)。…

Mysql——三、SQL语句(上篇)

Mysql 一、SQL语句基础1、SQL简介2、SQL语句分类3、SQL语句的书写规范 二、数据库操作三、MySQL 字符集1、变量2、utf8和utf8mb4的区别 四、数据库对象五、SELECT语句1、简单的SELECT语句2、SQL函数2.1 聚合函数2.2 数值型函数2.3 字符串函数2.4 日期和时间函数2.5 流程控制函数…

uniapp iOS离线打包——如何创建App并提交版本审核?

uniapp 如何创建App&#xff0c;并提交版本审核&#xff1f; 文章目录 uniapp 如何创建App&#xff0c;并提交版本审核&#xff1f;登录 appstoreconnect创建AppiOS 预览和截屏应用功能描述技术支持App 审核信息 App 信息内容版权年龄分级 价格与销售范围App 隐私提交审核 登录…

【Aurora 8B/10B IP(1)--初步了解】

Aurora 8B/10B IP(1)–初步了解 1 Aurora 8b/10b IP的基本状态: •通用数据通道吞吐量范围从480 Mb/s到84.48 Gb/s •支持多达16个连续粘合7GTX/GTH系列、UltraScale™ GTH或UltraScale+™ GTH收发器和4绑定GTP收发器 •Aurora 8B/10B协议规范v2.3顺从的 •资源成本低(请参…

搭建达梦8国产数据库一主一从双机热备案例达梦DMHS插件实战

搭建达梦8国产数据库一主一从双击热备案例达梦DMHS插件实战 一、测试环境介绍 测试服务器操作系统&#xff1a;centos7 select *&#xff0c;id_code from v$version; #查询达梦8当前版本服务器IP角色172.18.21.144达梦8主数据库172.18.21.145达梦8备份数据库 提前把防火…

SAP替代物料的解决方案详解

说明&#xff1a; SAP中的替代有三种&#xff1a; A物料和B物料可以互相替代&#xff0c;但是由物料计划部门自由控制使用A还是使用B;在某个产品中&#xff0c;当物料A不够时&#xff0c;才用B&#xff1b;当物料A用完后&#xff0c;将永远不再用&#xff0c;而是用物料B取代A…

【C/C++】C/C++面试八股

C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的&#xff1f;构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么&#xff1f;为什么要内存对齐static关键…