【C++】vector常用方法总结

news2025/4/25 9:15:56

📝前言:
在C++中string常用方法总结中我们讲述了string的常见用法,vector中许多接口与string类似,作者水平有限,所以这篇文章我们主要通过读vector官方文档的方式来学习vector中一些较为常见的重要用法。

🎬个人简介:努力学习ing
📋个人专栏:C++学习笔记
🎀CSDN主页 愚润求学
🌄其他专栏:C语言入门基础,python入门基础,python刷题专栏


vector常见方法

  • 一,vector的定义
    • 1. vector的构造函数
    • 2. 迭代器
    • 3. 容量操作
    • 4. 增删查改操作
    • 5. 迭代器失效问题
      • 5.1. 插入元素引发的迭代器失效
      • 5.2. 删除元素导致的迭代器失效
      • 5.3. 调整容器大小引起的迭代器失效
      • 5.4. 避免迭代器失效的方法
        • 1. 插入元素时
        • 2. 删除元素时
        • 3. 调整容器大小时
    • 6. 小知识点补充

一,vector的定义

vector原型:template < class T, class Alloc = allocator<T> > class vector; // generic template

也就是说vector是一个模板,T可以是任意类型,如intstring,甚至是vector<int>(此时是一个二维数组)

特点

  • 动态大小:vector可以在运行时按需调整大小,可以添加或移除元素。
  • 随机访问:能在常数时间内通过索引访问任意元素。
  • 连续存储:元素在内存中连续存储
  • 自动内存管理:vector会自动处理内存分配和释放

1. vector的构造函数

在这里插入图片描述

const allocator_type& alloc = allocator_type()是一个有关内存分配的参数,它的作用是指定 vector 所使用的内存分配器。内存分配器负责管理 vector 内部元素存储所需的内存。(在这里我们先不管它)

  1. vector()是vector的无参默认构造,会创建一个空的vector对象
  2. vector (size_type n, const value_type& val = value_type())构造并初始化nval
    这里的value_type()是调用value_type的构造函数,用匿名对象来初始化val。(对于内置类型,为了统一,内置类型也会有默认构造,不过默认构造不做任何处理,如:int a = int()这里相当于用0来初始化a
  3. vector (InputIterator first, InputIterator last)用区间迭代器初始化构造(注意是左闭右开原则)
  4. vector (const vector& x)拷贝构造(深拷贝)

2. 迭代器

vector也有和string类似的迭代器,值得注意的是endrend的位置
在这里插入图片描述

3. 容量操作

接口接口说明
size获取元素个数
capacity获取容量大小
empty判断是否为空
reserve改变capacity
resize改变size

这些接口和方法的特性和string一样就不过多赘述

4. 增删查改操作

接口接口说明
push_back尾插
pop_back尾删
find查找
insert在position插入val(原来position位置的元素后移)
erase从position位置开始删除数据
swap交换两个vector的数据空间
operator[]像数组一样访问

注意find是算法模块实现,不是vector的成员接口。这些接口和方法的特性和string一样就不过多赘述

5. 迭代器失效问题

在使用vector的迭代器时,若容器的底层空间改变(如扩容),就可能导致迭代器失效
迭代器失效就是:迭代器已经不是指向原来的数据,此时意义发生改变(可能指向别的位置,也可能是随机值)

迭代器失效后,我们就不能访问原来已经失效的的迭代器。在vs中会强制检查,访问即报错,但是在Linux中不强制检查。

5.1. 插入元素引发的迭代器失效

当在vector里插入元素时,若insert操作致使容器重新分配内存(扩容),那么所有指向该容器的迭代器都会失效。这是因为重新分配内存时,容器中的元素会被移动到新的内存位置,而原来的迭代器依旧指向旧的内存地址,原来的地址又被释放,此时就指向随机值了(类似野指针)。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin();
    // 插入元素可能导致内存重新分配
    vec.insert(vec.begin(), 0); 
    // 此时 it 已经失效,不能再使用
    // std::cout << *it << std::endl; // 错误:使用失效的迭代器
    return 0;
}

5.2. 删除元素导致的迭代器失效

vector中删除元素时,被删除元素及其后面的所有迭代器都会失效。因为删除元素后,后面的元素会向前移动填补空缺,原有的迭代器指向的位置不再正确。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin() + 1;
    // 删除元素
    vec.erase(vec.begin()); 
    // 此时 it 已经失效,不能再使用
    // std::cout << *it << std::endl; // 错误:使用失效的迭代器
    return 0;
}

5.3. 调整容器大小引起的迭代器失效

调用vectorresizereserve等方法改变容器大小时,若触发了内存重新分配,所有迭代器都会失效。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin();
    // 调整容器大小可能导致内存重新分配
    vec.resize(10); 
    // 此时 it 已经失效,不能再使用
    // std::cout << *it << std::endl; // 错误:使用失效的迭代器
    return 0;
}

5.4. 避免迭代器失效的方法

1. 插入元素时

插入元素后,使用插入操作返回的迭代器来更新原有的迭代器。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin();
    // 插入元素并更新迭代器
    it = vec.insert(it, 0); 
    std::cout << *it << std::endl; // 正确:使用更新后的迭代器
    return 0;
}
2. 删除元素时

删除元素后,使用删除操作返回的迭代器来更新原有的迭代器。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin() + 1;
    // 删除元素并更新迭代器
    it = vec.erase(vec.begin()); 
    std::cout << *it << std::endl; // 正确:使用更新后的迭代器
    return 0;
}
3. 调整容器大小时

在调用resizereserve等方法后,若发生了内存重新分配,要重新获取迭代器。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin();
    vec.resize(10);
    // 重新获取迭代器
    it = vec.begin(); 
    std::cout << *it << std::endl; // 正确:使用更新后的迭代器
    return 0;
}

6. 小知识点补充

1,memmovememcpystrcpy
三者功能差不多,strcpy针对字符,memcpy直接复制字节,memmove也复制字节,但是可以解决内存重叠问题。在无内存重叠的时候memcpy性能更好

2,当我们在没有实例化的类模板里面取东西,如:vector<T> a ,此时编译器无法判断a是类型还是变量。这时候,如果是类型,需要在前面加上typename,变成:typename vector<T> a b(这样就可以用类型a定义b

3,如果已经写了构造函数,还是想让编译器生成默认构造:vector() = default

4,传参的时候后面跟u表示unsigned int,可以避免函数重构,调用时的歧义。如:vector(10u,1)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p41286 在数字技术与实体经济深度融合的当下&#xff0c;数智化产业带正成为经济发展的关键引擎。 从云南鲜花产业带的直播热销到深圳3C数码的智能转型&#xff0c;数智化正重塑产业格局。2023年数字经济规模突破53.9万亿元&#xff…

Linux中常用服务器监测命令(性能测试监控服务器实用指令)

1.查看进程 ps -ef|grep 进程名以下指令需要先安装:sysstat,安装指令: yum install sysstat2.查看CPU使用情况(间隔1s打印一个,打印6次) sar -u 1 63.#查看内存使用(间隔1s打印一个,打印6次) sar -r 1 6

基于 GEE 的区域降水数据可视化:从数据处理到等值线绘制

目录 1 引言 2 代码功能概述 3 代码详细解析 3.1 几何对象处理与地图显示 3.2 加载 CHIRPS 降水数据 3.3 筛选不同时间段的降水数据 3.4 绘制降水时间序列图 3.5 计算并可视化短期和长期降水总量 3.6 绘制降水等值线图 4 总结 5 完整代码 6 运行结果 1 引言 在气象…

曲线拟合 | Matlab基于贝叶斯多项式的曲线拟合

效果一览 代码功能 代码功能简述 目标&#xff1a;实现贝叶斯多项式曲线拟合&#xff0c;动态展示随着数据点逐步增加&#xff0c;模型后验分布的更新过程。 核心步骤&#xff1a; 数据生成&#xff1a;在区间[0,1]生成带噪声的正弦曲线作为训练数据。 参数设置&#xff1a…

Qt6调试项目找不到Bluetooth Component蓝牙组件

错误如图所示 Failed to find required Qt component "Bluetooth" 解决方法&#xff1a;搜索打开Qt maintenance tool 工具 打开后&#xff0c;找到这个Qt Connectivity&#xff0c;勾选上就能解决该错误

JAVA- 锁机制介绍 进程锁

进程锁 基于文件的锁基于Socket的锁数据库锁分布式锁基于Redis的分布式锁基于ZooKeeper的分布式锁 实际工作中都是集群部署&#xff0c;通过负载均衡多台服务器工作&#xff0c;所以存在多个进程并发执行情况&#xff0c;而在每台服务器中又存在多个线程并发的情况&#xff0c;…

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…

深入剖析JavaScript多态:从原理到高性能实践

摘要 JavaScript多态作为面向对象编程的核心特性&#xff0c;在动态类型系统的支持下展现了独特的实现范式。本文深入解析多态的三大实现路径&#xff1a;参数多态、子类型多态与鸭子类型&#xff0c;详细揭示它们在动态类型系统中的理论基础与实践意义。结合V8引擎的优化机制…

GalTransl开源程序支持GPT-4/Claude/Deepseek/Sakura等大语言模型的Galgame自动化翻译解决方案

一、软件介绍 文末提供程序和源码下载 GalTransl是一套将数个基础功能上的微小创新与对GPT提示工程&#xff08;Prompt Engineering&#xff09;的深度利用相结合的Galgame自动化翻译工具&#xff0c;用于制作内嵌式翻译补丁。支持GPT-4/Claude/Deepseek/Sakura等大语言模型的…

TGES 2024 | 基于空间先验融合的任意尺度高光谱图像超分辨率

Arbitrary-Scale Hyperspectral Image Super-Resolution From a Fusion Perspective With Spatial Priors TGES 2024 10.1109/TGRS.2024.3481041 摘要&#xff1a;高分辨率高光谱图像&#xff08;HR-HSI&#xff09;在遥感应用中起着至关重要的作用。单HSI超分辨率&#xff…

算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】

算法基础_基础算法【高精度 前缀和 差分 双指针】 ---------------高精度---------------791.高精度加法题目介绍方法一&#xff1a;代码片段解释片段一&#xff1a; 解题思路分析 792. 高精度减法题目介绍方法一&#xff1a;代码片段解释片段一&#xff1a; 解题思路分析 7…

Python数据类型-list

列表(List)是Python中最常用的数据类型之一&#xff0c;它是一个有序、可变的元素集合。 1. 列表基础 创建列表 empty_list [] # 空列表 numbers [1, 2, 3, 4, 5] # 数字列表 fruits [apple, banana, orange] # 字符串列表 mixed [1, hello, 3.14, True] # 混合类型…

如何使用cpp操作香橙派GPIO --使用<wiringPi.h>

香橙派是国产SBC &#xff0c;对标树莓派。不过国内的开发环境确实挺惨的&#xff0c;没多少帖子讨论。楼主决定从今天起&#xff0c;不定期更新香橙派的教程。 今天的教程是如何使用香橙派下载wiringOP 并使用CPP操作GPIO 操作GPIO 下载wiringPi 检查git 版本克隆wiringPi…

nacos-sdk-go v2.29 中一个拼写错误,我定位了3个小时 ……

文章目录 问题背景问题现象问题定位解决方案经验总结 问题背景 今天在给项目增加服务注册和发现功能时,选择了 nacos 作为服务注册中心。在使用 nacos-sdk-go v2.29 版本进行开发时,遇到了一个令人啼笑皆非的问题,足足花了3个小时才找到原因。 问题现象 在实现服务订阅通知功…

Linux中的文件寻址

Linux的层级结构 在Linux中一切皆文件 其中 要注意在命令行中看实际选择写哪一种路径 相对路径 绝对路径名称的简写&#xff0c;省略了用户当前所在的系统位置此名称只有在管理当前所在系统目录中子文件时才能使用系统中不以/开有的文件名称都为相对路径在程序操作时会自动…

静态时序分析:时钟标记(作为数据使用的时钟)及其分析方式

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 引言 一般情况下&#xff0c;设计中的时钟路径和数据路径是严格区分开的&#xff1a;时钟路径即从时钟源对象&#xff08;时钟定义点&#xff09;到触发器的时钟…

AI学习记录-QWQ32b太强了

业务理解能力爆表&#xff0c;指令遵循能力极强&#xff0c;才32b成本极低&#xff0c;大量的公司的项目可以嵌入到自己的项目当中了&#xff0c;再fineture一下&#xff0c;以后不上AI的系统都卖不出去了。 试验1 输出 试验2: 输出

STM32 FATFS - 在spi的SD卡中运行fatfs

参考文章 STM32 CubeMX 硬件SPI SD卡 FATFS_stm32cubemx fatfs-CSDN博客 例程地址&#xff1a;STM32FatFS: 基于stm32的fatfs例程&#xff0c;配合博客文章 基于野火STM32MINI开发板 STM32配置 系统模式配置 输出串口配置 SPI配置 使用全双工模式&#xff0c;禁用硬件…

FreeCAD傻瓜教程-装配体Assembly的详细使用过程

源起&#xff1a; 看了官方的教程说明&#xff0c;感觉太过简单&#xff0c;好多细节没有体现&#xff0c;且该部分的翻译还没有。这里是做个记录&#xff0c;对使用过程中的细节进行图文说明&#xff0c;以方便真正的新手能够快速应用&#xff0c;制作出自己的零件&#xff0c…

数字电子技术基础(三十七)——利用Multisim软件实现16线-4线编码器和4线-16线译码器

1 利用Multisim软件来实现16线-4线编码器 在之前的博客中完成了利用Multisim软件实现8线-3线优先编码器&#xff0c;现在使用Multisim软件来实现16线-4线编码器&#xff0c;其原理图如下所示&#xff1a; 使用字发生器来实现16线-4线编码器&#xff0c;器件选择&#xff1a; …