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():清空向量中的所有元素。
还有其他方法,如 insert、erase、resize 等,可以更灵活地操作 vector。
作用: vector 的主要作用是提供一个动态大小的数组,可以在运行时动态地添加或删除元素。这使得它非常适合需要管理不定数量元素的情况,而无需手动管理内存。
注意点: 在使用 vector 时需要注意以下几点:
-
性能开销: 在向
vector中添加或删除元素时,可能需要重新分配内存,因此在频繁插入或删除元素时,可能会有性能开销。可以使用reserve方法提前分配一定大小的内存,以减少重新分配的次数。 -
迭代器失效: 当向
vector中插入或删除元素时,迭代器(iterator)可能会失效,因此要小心在迭代过程中修改vector。 -
内存管理:
vector会自动处理内存管理,但要确保在不需要使用时及时销毁对象,以防止内存泄漏。 -
元素访问: 使用
at(index)方法访问元素时,要确保索引在有效范围内,否则会触发越界错误。 -
元素类型:
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 中的元素。
接下来,示例了一些错误用法及其分析:
-
访问越界: 如果尝试访问
vector中不存在的索引(如myVector[5]),会导致访问越界错误,可能导致程序崩溃或不可预测的行为。 -
使用错误的类型: 如果尝试将不同类型的元素添加到
vector中(如myVector.push_back("hello"),其中 "hello" 是字符串而不是整数),会导致类型不匹配错误。 -
迭代器失效: 在迭代
vector时,如果在迭代过程中修改了vector的大小(例如使用erase删除元素),迭代器会失效,导致未定义的行为。上面的示例代码中的注释部分演示了这一点。
正确使用 vector 需要注意这些潜在的错误,以确保代码的健壮性和正确性。在生产环境中,可以考虑使用更安全的方法,如使用范围循环(range-based loop)或迭代器遍历 vector,以避免迭代器失效问题。
如何理解迭代器失效?
理解迭代器失效(Iterator Invalidation)是在使用C++容器(如vector、list、map等)时非常重要的概念。迭代器是一种用于遍历容器元素的对象,类似于指针,它指向容器中的一个特定元素。当容器发生结构性变化(例如插入、删除元素)时,迭代器可能会失效,意味着它们不再指向有效的元素或已经被释放,因此进一步使用这些失效的迭代器可能导致未定义的行为或崩溃。
以下是一些常见的导致迭代器失效的操作和情况:
-
插入和删除元素: 当向容器中插入或删除元素时,容器内的元素可能需要重新分配内存以适应新的大小,这会导致现有迭代器指向的元素位置不再有效。例如,在
vector中使用push_back或erase操作可能会导致迭代器失效。 -
改变容器大小: 调用像
resize这样的方法会更改容器的大小,这可能会导致迭代器失效。 -
使用非常量迭代器: 如果你使用了非常量迭代器(例如
vector<int>::iterator),并且在遍历过程中修改了容器的元素,那么迭代器可能会失效。这是因为非常量迭代器允许修改元素,但这可能会导致容器重新分配内存,从而使迭代器失效。 -
删除或插入容器之外的元素: 如果你删除或插入容器之外的元素(例如在
map中),则可能导致相关迭代器失效。 -
复制或赋值容器: 在复制或赋值容器时,新容器的迭代器不再与原容器的迭代器相互关联,因此不能将原容器的迭代器用于新容器。
为了避免迭代器失效,可以考虑以下方法:
-
使用范围循环(range-based loop):范围循环是一种简化遍历容器的方法,它可以避免使用显式迭代器。
-
使用常量迭代器:如果不需要修改容器中的元素,可以使用常量迭代器(例如
vector<int>::const_iterator)来确保容器不会在遍历过程中被修改。 -
使用合适的迭代器:如果需要修改容器,确保在修改期间不会发生容器大小的变化。此外,可以使用
erase和insert等方法返回的新迭代器,以确保它们仍然有效。
总之,理解和注意迭代器失效是编写安全和健壮的C++代码的关键,特别是在涉及到容器操作时。选择合适的迭代器类型以及避免在遍历过程中修改容器可以帮助减少迭代器失效的风险。
相关文章:
C++:vector 定义,用法,作用,注意点
C 中的 vector 是标准模板库(STL)提供的一种动态数组容器,它提供了一组强大的方法来管理和操作可变大小的数组。以下是关于 vector 的定义、用法、作用以及一些注意点: 定义: 要使用 vector,首先需要包含 …...
Firecamp2.7.1exe安装与工具调试向后端发送SocketIO请求
背景: 笔者在python使用socket-io包时需要一个测试工具,选择了firecamp这个测试工具来发送请求。 参考视频与exe资源包: Firecamp2.7.1exe安装包以及基本使用说明文档(以SocketIO为例).zip资源-CSDN文库 15_send方法…...
MySQL到TiDB:Hive Metastore横向扩展之路
作者:vivo 互联网大数据团队 - Wang Zhiwen 本文介绍了vivo在大数据元数据服务横向扩展道路上的探索历程,由实际面临的问题出发,对当前主流的横向扩展方案进行了调研及对比测试,通过多方面对比数据择优选择TiDB方案。其次分享了整…...
算法通关村-----寻找祖先问题
最近公共祖先 问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一…...
Sentinel结合Nacos实现配置持久化(全面)
1、前言 我们在进行分布式系统的开发中,无论是在开发环境还是发布环境,配置一定不能是内存形式的,因为系统可能会在中途宕机或者重启,所以如果放在内存中,那么配置在服务停到就是就会消失,那么此时就需要重…...
Verilog中什么是断言?
断言就是在我们的程序中插入一句代码,这句代码只有仿真的时候才会生效,这段代码的作用是帮助我们判断某个条件是否满足(例如某个数据是否超出了范围),如果条件不满足(数据超出了范围)࿰…...
Oracle分区的使用详解:创建、修改和删除分区,处理分区已满或不存在的插入数据,以及分区历史数据与近期数据的操作指南
一、前言 什么是表分区: Oracle的分区是一种将表或索引数据分割为更小、更易管理的部分的技术。它可以提高查询性能、简化维护操作,并提供更好的数据组织和管理。 表分区和表空间的区别和联系: 在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对…...
SLAM从入门到精通(amcl定位使用)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习slam,一般就是所谓的边定位、边制图的知识。然而在实际生产过程中,比如扫地机器人、agv、巡检机器人、农业机器人&…...
【C/C++】C/C++面试八股
C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的?构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么?为什么要内存对齐static关键…...
Scala第八章节
Scala第八章节 scala总目录 章节目标 能够使用trait独立完成适配器, 模板方法, 职责链设计模式能够独立叙述trait的构造机制能够了解trait继承class的写法能够独立完成程序员案例 1. 特质入门 1.1 概述 有些时候, 我们会遇到一些特定的需求, 即: 在不影响当前继承体系的情…...
k8s-实战——kubeadm二进制编译
文章目录 源码编译获取源码修改证书有效期修改 CA 有效期为 100 年(默认为 10 年)修改证书有效期为 100 年(默认为 1 年)CentOS7.9环境准备centos脚本安装执行脚本脚本内容手动安装验证编译查看编译后的版本信息参考链接脚本修改源码编译 源码编译kubeadm文件、修改证书的默…...
vite 和 webpack 的区别
1. 构建原理: Webpack 是一个静态模块打包器,通过对项目中的JavaScript、css、Image 等文件进行分析,生成对应的静态资源,并且通过一些插件和加载器来实现各种功能。 Vite 是一种基于浏览器元素 ES 模块解析构建工具,…...
传统遗产与技术相遇,古彝文的数字化与保护
古彝文是中国彝族的传统文字,具有悠久的历史和文化价值。然而,由于古彝文的形状复杂且没有标准化的字符集,对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术,旨在提高古彝文的自动识别准确性…...
多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)
多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制) 目录 多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述…...
1042 字符统计
description 请编写程序,找出一段给定文字中出现最频繁的那个英文字母。 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束ÿ…...
3 OpenCV两张图片实现稀疏点云的生成
前文: 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵RANSAC原理与实践 1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式…...
在Springboot项目中使用Redis提供给Lua的脚本
在Springboot项目中使用Redis提供给Lua的脚本 在Spring Boot项目中,你可以使用RedisTemplate来执行Lua脚本。RedisTemplate是Spring Data Redis提供的一个Redis客户端,它可以方便地与Redis进行交互。以下是使用RedisTemplate执行Lua脚本的一般步骤&…...
分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测
分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测&…...
Linux或Centos查看CPU和内存占用情况_top只能查看对应的命令_如何查看具体进程---linux工作笔记062
一般我们都是用top去查看,但是top查看的结果,不能看出,具体是哪个程序占用的,这就很苦恼.. 其实如果有时间的话,再去专门看一下网络安全和linux脚本以及命令方面的,比较系统的看一下比较好.现在积累的都是工作中用到的,比较零散的知识. 如果用top,比如说这里的java,就只能知道…...
什么是DevOps
文章目录 一、概念二、地位三、目标四、要求五、具体手段 一、概念 是一组过程、方法与系统的统称,有助于打破开发、测试、运维、交付部门之间的壁垒,提高部门间的沟通协助能力。 二、地位 应成为公司的一种理念、文化、哲学。 三、目标 实现更加高…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
21-Oracle 23 ai-Automatic SQL Plan Management(SPM)
小伙伴们,有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL, 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始,OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...
