【C/C++】C++ Vector容器核心操作指南:增删改查全面解析

🔗 运行环境:C/C++

🚩 撰写作者:左手の明天

🥇 精选专栏:《python》

🔥  推荐专栏:《算法研究》

🔐#### 防伪水印——左手の明天 ####🔐

💗 大家好🤗🤗🤗,我是左手の明天!好久不见💗

💗今天分享【C/C++】——vector的增删改查操作💗

📆  最近更新:2025 年 02 月 15 日,左手の明天的第 350 篇原创博客

📚 更新于专栏:C/C++入门与进阶

🔐#### 防伪水印——左手の明天 ####🔐


一、Vector容器概述

Vector是C++标准模板库(STL)中最常用的序列式容器,本质上是一个动态数组。与静态数组相比,vector具有以下核心优势:

  1. 动态扩容:自动管理内存空间,容量随元素增加自动扩展

  2. 类型安全:强类型约束保证数据一致性

  3. 丰富接口:提供超过30种成员函数方便操作

  4. 迭代器支持:兼容STL算法和泛型编程

二、基础操作快速入门

1. 包含头文件

首先,确保你的代码中包含了vector的头文件:

#include <vector>

2. 容器创建与初始化

// 创建空vector
vector<int> v1;// 指定初始容量
vector<string> v2(10); // 初始化列表(C++11)
vector<char> vowels {'a', 'e', 'i', 'o', 'u'};// 拷贝构造
vector<float> v3(v2);

还可以使用不同的方式来初始化vector

std::vector<int> vec1; // 默认初始化,创建一个空的vectorstd::vector<int> vec2(10); // 创建一个包含10个默认值(0)的vectorstd::vector<int> vec3(10, 1); // 创建一个包含10个值1的vectorstd::vector<int> vec4 = {1, 2, 3, 4, 5}; // 使用初始化列表初始化vector

3. 元素访问操作

vector<double> prices {19.99, 9.99, 15.49};// 下标访问(不检查越界)
cout << prices[0];  // 19.99// at()方法(边界检查)
cout << prices.at(1); // 9.99// 首尾元素访问
cout << prices.front(); // 19.99
cout << prices.back();  // 15.49

三、核心操作深度解析

1. 元素添加操作

vector<int> nums;// 尾部追加
nums.push_back(10);  // [10]// 批量插入
nums.insert(nums.end(), {20, 30}); // [10,20,30]// 指定位置插入
auto it = nums.begin() + 1;
nums.insert(it, 15); // [10,15,20,30]// 高效构造(C++11)
nums.emplace_back(40); // 避免临时对象拷贝

2. 元素删除操作

  • 删除末尾元素:使用pop_back()方法。

  • 删除指定位置的元素:可以使用erase()方法。

vec1.pop_back(); // 删除vec1的最后一个元素

vec1.erase(vec1.begin() + 2); // 删除vec1中索引为2的元素(注意索引从0开始)

vector<string> names {"Alice", "Bob", "Charlie"};// 移除末尾元素
names.pop_back();  // 移除"Charlie"// 删除指定位置
names.erase(names.begin()); // 删除"Alice"// 范围删除
names.erase(names.begin()+1, names.end()); // 清空容器
names.clear();

3. 数据修改操作

直接通过索引访问并修改元素:

vec1[2] = 20; // 将vec1中索引为2的元素修改为20

vector<int> data {1,2,3,4};// 直接修改元素
data[1] = 20;  // [1,20,3,4]// 使用迭代器修改
auto it = data.begin() + 2;
*it = 30;      // [1,20,30,4]// 范围替换
vector<int> newData {5,6,7};
data.swap(newData); // data现在为[5,6,7]

4. 数据查询操作

(1)通过索引访问元素:

int value = vec1[2]; // 获取vec1中索引为2的元素的值

(2)使用find()方法,注意find()返回的是一个迭代器:

vector<string> colors {"red", "green", "blue"};// 遍历查询
for(const auto& color : colors) {if(color == "green") {cout << "Found green";}
}// 使用find算法
auto pos = find(colors.begin(), colors.end(), "blue");
if(pos != colors.end()) {cout << "Index: " << pos - colors.begin();
}

5. 获取大小和容量

  • 大小:已存储的元素数量。

  • 容量:在不重新分配内存的情况下,容器能保存的元素的最大数量。

std::cout << "Size: " << vec1.size() << std::endl; // 输出vec1的大小(已存储的元素数量)std::cout << "Capacity: " << vec1.capacity() << std::endl; // 输出vec1的容量(最大存储能力)

四、性能优化与最佳实践

1. 容量管理

vector<int> vec;
vec.reserve(1000);  // 预分配空间,避免多次扩容

2. 高效插入

// 批量插入比单次插入更高效
vector<int> source {1,2,3};
vec.insert(vec.end(), source.begin(), source.end());

3. 删除优化

// 高效移除特定元素(删除所有奇数)
vec.erase(remove_if(vec.begin(), vec.end(), [](int x){return x%2 !=0;}), vec.end());

五、典型应用场景

  1. 动态数据集处理(实时数据流)

  2. 需要随机访问的集合操作

  3. 替代传统数组的现代化方案

  4. 算法实现中的临时容器

六、注意事项

1. 迭代器失效问题

  • 插入操作可能导致所有迭代器失效

  • 删除操作会使被删元素之后的迭代器失效

2. 复杂度分析

  • 随机访问:O(1)

  • 尾部操作:O(1)

  • 中间插入/删除:O(n)

3. 容器选择建议

  • 频繁头部操作:考虑deque

deque的定义和特性

deque(双端队列)是C++标准模板库(STL)中的一种数据结构,允许在两端进行插入和删除操作。deque是基于动态数组实现的,与vector类似,但deque在两端操作上有更好的性能。其特点包括:

  • 高效的两端操作‌:deque可以在头部和尾部以O(1)的时间复杂度进行插入和删除操作。
  • 非连续存储‌:与vector不同,deque的元素不一定在内存中连续存储,这使得在序列中间插入或删除元素时更加高效‌。

与其他数据结构的比较

  • 与vector的比较‌:虽然deque和vector都使用动态数组实现,但deque允许在两端高效地进行插入和删除操作,而vector只能在尾部高效地进行这些操作。此外,deque的元素不一定连续存储,这使其在序列中间操作时更灵活‌。
  • 与list的比较‌:list是一个双向链表,支持在任意位置的快速插入和删除操作,但其随机访问效率较低。deque在频繁的头部操作上比list更优,但在遍历效率上不如list‌。

使用场景

deque常用于需要频繁在头部和尾部进行操作的场景,如实现栈和队列的底层结构。由于其高效的头部和尾部操作特性,deque在需要快速入栈和出栈的操作中表现优异‌。

  • 大量插入删除:考虑list

七、进阶技巧

  1. 内存分配策略:capacity()和size()的差异

  2. 移动语义优化(C++11)

  3. 自定义分配器使用

  4. 多维vector应用

vector<vector<int>> matrix(5, vector<int>(5)); // 5x5矩阵

总结

Vector作为C++中最核心的容器之一,其灵活性和易用性使其成为开发者的首选容器。通过合理使用增删改查接口,结合性能优化技巧,可以充分发挥vector的优势。建议在实际开发中根据具体需求选择合适的容器,对于需要频繁在中间位置进行插入删除操作的场景,可考虑改用list或deque等其他容器。

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

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

相关文章

啥是目标文件?目标文件里面有什么?

从c文件到二进制可执行文件主要经过预处理、编译、汇编和链接的过程&#xff0c;而在这些过程中参与到的文件类型主要有源文件、头文件、目标文件、静态库、动态库和可执行文件。下面表格对这些文件的生成过程和涉及到的步骤名称做个总结。 过程涉及文件编译source header -&…

Day45(补)【软考】2022年下半年软考软件设计师综合知识真题-计算机软件知识1

文章目录 2022年下半年软考软件设计师综合知识真题第1章 计算机系统基础知识(12/38)计算机软件知识1-6/6哲学概念及收敛思维&#xff1a;是Python程序语言中&#xff0c;处理异常的结构集合&#xff0c;和这个集合之外的结构的区分&#xff0c;考Python集合之外的结构 哲学概念…

Spring MVC Streaming and SSE Request Processing SSE可以实现chatgpt一次请求分批次响应的效果

1. Introduction This simple tutorial demonstrates the use of several asynchronous and streaming objects in Spring MVC 5.x.x. Specifically, we’ll review three key classes: ResponseBodyEmitterSseEmitterStreamingResponseBody Also, we’ll discuss how to i…

应对DeepSeek总是服务器繁忙的解决方法

最近由于访问量过大&#xff0c;DeepSeek服务器官网经常弹出&#xff1a;“服务器繁忙&#xff0c;请稍后再试”的提示&#xff0c;直接卡成PPT怎么办&#xff1f;服务器繁忙直接看到视觉疲劳&#xff1a; 解决DeepSeek卡顿问题 DeepSeek使用卡顿问题&#xff0c;是因为访问量…

GoC题解(21) 725.画迷宫(下册第4课)

题目描述 真观察下面迷宫图。发现它是一个边长逐渐变长的15边回旋图&#xff0c;边长依次为10、20、30....。 参考答案 int main(){int len0;for(int i1;i<15;i){ len10;pen.fd(len).rt(90); }return 0; } 解题思路 使用一个变量来记录每次循环时应该画多长的边&#…

STM32之SG90舵机控制

目录 前言&#xff1a; 一、硬件准备与接线 1.1 硬件清单 1.2 接线 二、 SG90舵机简介 1.1 外观 1.2 基本参数 1.3 引脚说明 1.4 控制原理 1.5 特点 1.6 常见问题 三、 单片机简介 四、 程序设计 4.1 定时器配置 4.2 角度控制函数 4.3 主函数调用 五、 总结 …

在vscode中拉取gitee里的项目并运行

拉取项目: 方法一:vscode点击查看--->终端(或者直接通过快捷键ctrol+ `打开) 在终端内通过cd命令定位到你想存放项目的文件夹 例如:cd h: 通过命令:git clone 地址 例如:git clone newbee-mall-vue-app: 前端代码 等待拉取完成即可在对应文件夹下看到项目啦 方…

机器学习实战(2):数据预处理——机器学习的第一步

第2集&#xff1a;数据预处理——机器学习的第一步 在机器学习的旅程中&#xff0c;数据预处理是至关重要的第一步。它决定了模型训练的质量和最终性能。没有经过良好预处理的数据就像未经打磨的钻石&#xff0c;虽然可能蕴含价值&#xff0c;但难以展现其光彩。今天我们将深入…

B站视频同步思维导图(全)

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z 文章目录 前言分段视频一张思维导图版本手写版本联系作者 分段视频 Java基础 并发编程 MySQL redis…

Spring中@Import原理和使用

Import注解是Spring框架中一个非常强大的工具&#xff0c;它允许你将普通类、组件类、ImportSelector实现类和ImportBeanDefinitionRegistrar实现类引入到容器中。通过Import&#xff0c;你可以实现配置的模块化&#xff0c;使得代码更加清晰和易于维护。 Spring集成很多框架时…

《pytorch》——优化器的解析和使用

优化器简介 在 PyTorch 中&#xff0c;优化器&#xff08;Optimizer&#xff09;是用于更新模型参数以最小化损失函数的关键组件。在机器学习和深度学习领域&#xff0c;优化器是一个至关重要的工具&#xff0c;主要用于在模型训练过程中更新模型的参数&#xff0c;其目标是最…

第J2周:ResNet50V2算法实战与解析

文章目录 一、准备工作1.设置GPU2.导入数据3.查看数据 二、数据预处理1.加载数据2.可视化数据 总结 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 1.设置GPU import tensorflow as tf gpus …

CAS单点登录(第7版)18.日志和审计

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 日志和审计 Logging 概述 Logging CAS 提供了一个日志记录工具&#xff0c;用于记录重要信息事件&#xff0c;如身份验证成功和失败;可以对其进行自定义以生成用于故障排除的其他信息。…

Mybatisplus-IService

文章目录 简介IService如何继承基础业务完成复杂业务逻辑更简便的Lambda方法批处理 简介 IService类似于我们的BaseMapper吧 现在就是Service层的那些简单的CRUD也不用写了 下面是方法图 IService如何继承 不同于Mapper可以直接基础BaseMapper接口不用实现 我们的serviceIm…

一键安装教程

Maven 安装 右键 以管理员身份运行点击 下一步安装完成后会同步配置环境变量打开 cmd, 输入 mvn 查看mvn版本修改 maven 本地仓库地址 见图三, 本地新建文件夹&#xff0c;修改为你本地文件夹地址 Redis 安装 右键 以管理员身份运行点击 下一步会安装到选择的文件夹下 JAVA\R…

5分钟掌握LM Studio本地部署DeepSeek R1

文章目录 LM Studio安装与配置修改模型下载源下载DeepSeek R1模型模型选择配置模型部署API服务常见问题解决总结LM Studio安装与配置 下载地址:https://lmstudio.ai/ LM Studio 是一款专为开发者设计的轻量级集成开发环境(IDE),支持多种编程语言及框架,提供智能代码补全…

(前端基础)HTML(一)

前提 W3C:World Wide Web Consortium&#xff08;万维网联盟&#xff09; Web技术领域最权威和具有影响力的国际中立性技术标准机构 其中标准包括&#xff1a;机构化标准语言&#xff08;HTML、XML&#xff09; 表现标准语言&#xff08;CSS&#xff09; 行为标准&#xf…

Beszel监控Docker安装

一、Beszel Hub安装 #Beszel Hub安装 mkdir -p ./beszel_data && \ docker run -d \--name beszel \--restartunless-stopped \-v ./beszel_data:/beszel_data \-p 8090:8090 \henrygd/beszel#创建账号 账号/密码&#xff1a;adminadmin.com/adminadmin.com 二、Besz…

flutter image_cropper插件安装后 打包apk 报错命名空间问题

本篇文章主要讲解&#xff0c;Flutter安装完新依赖打包apk报错 A problem occurred configuring project ‘:image_cropper’. 命名空间问题的解决办法及原因说明。 日期&#xff1a;2025年2月15日 作者&#xff1a;任聪聪 一、报错现象&#xff1a; 报文信息&#xff1a; FAI…

unity学习41:动画里的曲线curve参数 和 事件 events

目录 1 曲线 curve 1.1 生成和修改曲线 1.2 曲线命名 animator参数命名&#xff0c;关联起来 1.3 可以修改animator的参数&#xff0c;也可以获取animator的参数 1.4 用脚本获得曲线的参数数值&#xff0c;并打印出来 1.4.1 获得曲线的test1参数 1.4.2 代码 1.4.3 测…