当前位置: 首页 > news >正文

【C++ STL】vector容器详解:从入门到精通

【C++ STL】vector容器详解:从入门到精通

摘要:本文深入讲解C++ STL中vector容器的使用方法,涵盖常用函数、代码示例及注意事项,助你快速掌握动态数组的核心操作!


一、vector概述

vector是C++标准模板库(STL)中序列容器的代表,本质上是一个动态数组。它能够根据需要自动调整大小,支持快速随机访问,在尾部插入/删除元素效率极高,是C++中最常用的容器之一。

核心特性

  • 动态扩容:内存空间自动增长(默认翻倍策略)
  • 连续存储:元素内存连续,支持指针偏移访问
  • 随机访问:O(1)时间复杂度访问任意元素
  • 尾部操作高效:push_back/pop_back的时间复杂度为O(1)

二、vector常用函数详解

1. 构造函数

vector<int> v1;             // 空vector
vector<int> v2(5, 100);     // 5个100
vector<int> v3(v2.begin(), v2.end());  // 迭代器构造
vector<int> v4(v3);         // 拷贝构造// C++11初始化列表
vector<int> v5 = {1,2,3,4,5};  

2. 元素访问

函数说明示例
[]随机访问(不检查越界)v[2] = 5;
at()带边界检查的访问v.at(3) = 10;
front()首元素int a = v.front();
back()尾元素int b = v.back();
data()返回指向数组的指针(C++11)int* p = v.data();

3. 容量操作

v.empty();      // 判断是否为空
v.size();       // 当前元素个数
v.capacity();   // 当前分配的存储容量
v.reserve(100); // 预分配至少100个元素的空间
v.resize(10);   // 调整元素个数为10(默认填充0)
v.shrink_to_fit(); // 请求移除未使用的容量(C++11)

4. 修改操作

尾部操作

v.push_back(10);     // 尾部插入元素
v.emplace_back(20);  // 更高效的尾部构造(C++11)
v.pop_back();        // 删除最后一个元素

插入删除

v.insert(v.begin()+2, 100);  // 在第三个位置插入100
v.emplace(v.begin(), 50);    // 构造插入(C++11)
v.erase(v.begin()+1);        // 删除第二个元素
v.erase(v.begin(), v.begin()+3); // 删除前三个元素
v.clear();                   // 清空所有元素

交换内容

vector<int> v6 = {6,7,8};
v.swap(v6);  // 交换两个vector的内容

三、vector遍历方式

1. 下标遍历

for(size_t i = 0; i < v.size(); ++i) {cout << v[i] << " ";
}

2. 迭代器遍历

for(auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}

3. 范围for循环(C++11)

for(int num : v) {cout << num << " ";
}

四、实战示例代码

#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec;// 添加元素for(int i=0; i<5; ++i){vec.push_back(i*10);} // vec: 0 10 20 30 40// 中间插入vec.insert(vec.begin()+2, 25); // 0 10 25 20 30 40// 删除元素vec.pop_back();        // 移除40vec.erase(vec.begin()); // 移除0 → 10 25 20 30// 修改元素vec[1] = 250;          // 10 250 20 30// 容量操作cout << "Capacity: " << vec.capacity() << endl; // 8vec.shrink_to_fit();cout << "New capacity: " << vec.capacity() << endl; //4// 遍历输出for(int num : vec) {cout << num << " ";}return 0;
}

输出结果

Capacity: 8
New capacity: 4
10 250 20 30 

五、注意事项

  1. 迭代器失效

    • 插入元素可能导致所有迭代器失效(扩容时)
    • 删除元素会使被删元素之后的迭代器失效
  2. 性能优化

    • 使用reserve()预分配空间避免频繁扩容
    • 优先选择emplace_back()而非push_back()
  3. 特殊类型

    • vector<bool>是特化版本,每个元素占1bit,行为可能与其他类型不同
  4. 内存管理

    • clear()只清空元素,不释放内存
    • 结合shrink_to_fit()可真正释放多余内存(C++11)

六、总结

vector凭借其高效的随机访问和动态扩展特性,成为处理动态数组需求的首选容器。合理使用reserve预分配、选择正确的插入方法,可以显著提升程序性能。掌握vector的各种操作,将为你的C++编程打下坚实基础!

相关文章:

【C++ STL】vector容器详解:从入门到精通

【C STL】vector容器详解&#xff1a;从入门到精通 摘要&#xff1a;本文深入讲解C STL中vector容器的使用方法&#xff0c;涵盖常用函数、代码示例及注意事项&#xff0c;助你快速掌握动态数组的核心操作&#xff01; 一、vector概述 vector是C标准模板库&#xff08;STL&am…...

OpenAI推出Deep Research带给我们怎样的启示

OpenAI 又发新产品了&#xff0c;这次是面向深度研究领域的智能体产品 ——「Deep Research」&#xff0c;貌似被逼无奈的节奏… 在技术方面&#xff0c;Deep Research搭载了优化后o3模型并通过端到端强化学习在多个领域的复杂浏览和推理任务上进行了训练。因没有更多的技术暴露…...

洛谷[USACO08DEC] Patting Heads S

题目传送门 题目难度&#xff1a;普及/提高一 题面翻译 今天是贝茜的生日&#xff0c;为了庆祝自己的生日&#xff0c;贝茜邀你来玩一个游戏。 贝茜让 N N N ( 1 ≤ N ≤ 1 0 5 1\leq N\leq 10^5 1≤N≤105) 头奶牛坐成一个圈。除了 1 1 1 号与 N N N 号奶牛外&#xff0…...

CSS 溢出内容处理:从基础到实战

CSS 溢出内容处理&#xff1a;从基础到实战 1. 什么是溢出&#xff1f;示例代码&#xff1a;默认溢出行为 2. 使用 overflow 属性控制溢出2.1 使用 overflow: hidden 裁剪内容示例代码&#xff1a;裁剪溢出内容 2.2 使用 overflow: scroll 显示滚动条示例代码&#xff1a;显示滚…...

Spring Boot项目如何使用MyBatis实现分页查询

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…...

飞行汽车中的无刷外转子电机、人形机器人中的无框力矩电机技术解析与应用

重点:无刷外转子电机与无框力矩电机&#xff1a;技术解析与应用对比 在现代工业自动化和精密机械领域&#xff0c;无刷电机因其高效、低噪音和高可靠性而备受青睐。其中&#xff0c;无刷外转子电机和无框力矩电机更是以其独特的结构和性能特点&#xff0c;成为众多应用场景中的…...

FreeRTOS学习 --- 队列集

队列集简介 一个队列只允许任务间传递的消息为同一种数据类型&#xff0c;如果需要在任务间传递不同数据类型的消息时&#xff0c;那么就可以使用队列集 &#xff01; 作用&#xff1a;用于对多个队列或信号量进行“监听”&#xff0c;其中不管哪一个消息到来&#xff0c;都可让…...

【R语言】R语言安装包的相关操作

一、管理R语言安装包 1、安装R包 install.packages() 2、查看已安装的R包 installed.packages() 3、更新R包 update.packages() 4、卸载R包 remove.packages() 二、加载R语言安装包 打开R语言时&#xff0c;基础包&#xff08;base包&#xff09;会自动被加载到内存中…...

15.[前端开发]Day15-HTML+CSS阶段练习(网易云音乐四)

完整代码 01_网易云-header <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…...

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户登录

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;1.登录-持久层 &…...

测试方案和测试计划相同点和不同点

在软件测试领域&#xff0c;测试方案与测试计划皆为举足轻重的关键文档&#xff0c;尽管它们有着紧密的关联&#xff0c;但在目的与内容层面存在着显著的差异。相同点&#xff1a; 1.共同目标&#xff1a;测试方案和测试计划的核心目标高度一致&#xff0c;均致力于保障软件的…...

c++提取矩形区域图像的梯度并拟合直线

c提取旋转矩形区域的边缘最强梯度点&#xff0c;并拟合直线 #include <opencv2/opencv.hpp> #include <iostream> #include <vector>using namespace cv; using namespace std;int main() {// 加载图像Mat img imread("image.jpg", IMREAD_GRAYS…...

Unity Shader Graph 2D - 角色身体电流覆盖效果

在游戏中,通常会有游戏角色受到“电击”的效果,此时游戏角色身体上会覆盖有电流,该效果能表明游戏角色的当前状态,让玩家能够获得更直观更好的体验。 那么如何实现呢 首先创建一个ShaderGraph文件,命名为Current,再创建对应的材质球M_Current。 基础的资源显示 老规矩,…...

【LLM-agent】(task4)搜索引擎Agent

note 新增工具&#xff1a;搜索引擎Agent 文章目录 note一、搜索引擎AgentReference 一、搜索引擎Agent import os from dotenv import load_dotenv# 加载环境变量 load_dotenv() # 初始化变量 base_url None chat_model None api_key None# 使用with语句打开文件&#xf…...

携程Java开发面试题及参考答案 (200道-下)

insert 一行数据的时候加的是什么锁?为什么? 在 MySQL 中,当执行 INSERT 操作插入一行数据时,加锁的情况会因存储引擎和具体的事务隔离级别而有所不同。一般来说,在 InnoDB 存储引擎下,INSERT 操作加的是行级排他锁(Row Exclusive Lock),以下详细说明原因。 行级排他…...

GWO优化SVM回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;&#xff0c;是由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出的群智能优化算法。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是对灰狼社会的结构与行为模式进行模仿。 …...

QMK启用摇杆和鼠标按键功能

虽然选择了触摸屏&#xff0c;我仍选择为机械键盘嵌入摇杆模块&#xff0c;这本质上是对"操作连续性"的执着。   值得深思的是&#xff0c;本次开发过程中借助DeepSeek的代码生成与逻辑推理&#xff0c;其展现的能力已然颠覆传统编程范式&#xff0c;需求描述可自动…...

Unity实现按键设置功能代码

一、前言 最近在学习unity2D&#xff0c;想做一个横版过关游戏&#xff0c;需要按键设置功能&#xff0c;让用户可以自定义方向键与攻击键等。 自己写了一个&#xff0c;总结如下。 二、界面效果图 这个是一个csv文件&#xff0c;准备第一列是中文按键说明&#xff0c;第二列…...

基于物联网技术的实时数据流可视化研究(论文+源码)

1系统方案设计 根据系统功能的设计要求&#xff0c;展开基于物联网技术的实时数据流可视化研究设计。如图2.1所示为系统总体设计框图&#xff0c;系统以STM32单片机做为主控制器&#xff0c;通过DHT11、MQ-2、光照传感器实现环境中温湿度、烟雾、光照强度数据的实时检测&#x…...

list容器(详解)

1. list的介绍及使用 1.1 list的介绍&#xff08;双向循环链表&#xff09; https://cplusplus.com/reference/list/list/?kwlist&#xff08;list文档介绍&#xff09; 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭…...

Lingbot-Depth-Pretrain-ViTL-14在互联网内容审核中的深度场景理解应用

Lingbot-Depth-Pretrain-ViTL-14在互联网内容审核中的深度场景理解应用 每天&#xff0c;互联网上都会产生数以亿计的图片和视频。对于平台的内容审核团队来说&#xff0c;这既是流量的盛宴&#xff0c;也是巨大的挑战。传统的审核方式&#xff0c;无论是依赖人工还是基于二维…...

Stable Diffusion 2.0超分实战:4倍放大图片还能保持清晰度的秘密

Stable Diffusion 2.0超分实战&#xff1a;4倍放大图片还能保持清晰度的秘密 在数字图像处理领域&#xff0c;超分辨率技术一直是设计师和开发者关注的焦点。传统放大方法往往导致图像模糊、细节丢失&#xff0c;而基于深度学习的超分方案正在改变这一局面。Stable Diffusion 2…...

告别轮询!用STM32F407的USART3+DMA+空闲中断实现高效串口数据接收

STM32F407高效串口通信&#xff1a;USART3DMA空闲中断实战指南 在嵌入式开发中&#xff0c;串口通信是最基础也最常用的外设之一。传统的中断接收方式虽然简单&#xff0c;但在高速或大数据量传输时&#xff0c;频繁的中断响应会显著增加CPU负担&#xff0c;甚至导致数据丢失。…...

Matlab源代码教程:枝晶生长模拟中的溶质与液相分数分析

枝晶生长模拟&#xff0c;溶质、液相分数&#xff0c;matlab源代码 教程相场法模拟枝晶生长这事挺有意思的——想象金属熔液凝固时&#xff0c;那些像雪花般绽放的晶体结构&#xff0c;背后其实是溶质扩散和相变的战场。今儿咱们用MATLAB整活&#xff0c;搞个能看见晶体长毛刺的…...

Qwen3-ASR-0.6B作品集:Qwen3-ForcedAligner-0.6B时间戳精度图谱

Qwen3-ASR-0.6B作品集&#xff1a;Qwen3-ForcedAligner-0.6B时间戳精度图谱 你有没有想过&#xff0c;一段语音里的每个字、每个词&#xff0c;甚至每个音节&#xff0c;是在哪个精确的时间点被说出来的&#xff1f;这听起来像是电影后期制作里的黑科技&#xff0c;但现在&…...

MongoDB高级面试:进阶面试题50题及答案详解

更多内容请见: 《深入掌握MongoDB数据库》 - 专栏介绍和目录 文章目录 一、高级查询优化与执行计划 (8题) 二、高级索引策略 (8题) 三、高级分片策略与优化 (8题) 四、性能调优与瓶颈分析 (7题) 五、高级复制集配置与故障处理 (6题) 六、高级事务与一致性模型 (5题) 七、安全高…...

如何用Wi-Fi信号实现非接触检测:ESP-CSI完整指南

如何用Wi-Fi信号实现非接触检测&#xff1a;ESP-CSI完整指南 【免费下载链接】esp-csi Applications based on Wi-Fi CSI (Channel state information), such as indoor positioning, human detection 项目地址: https://gitcode.com/GitHub_Trending/es/esp-csi 想要让…...

从零到一:AI工程开源资源全栈指南与实战应用

从零到一&#xff1a;AI工程开源资源全栈指南与实战应用 【免费下载链接】aie-book [WIP] Resources for AI engineers. Also contains supporting materials for the book AI Engineering (Chip Huyen, 2025) 项目地址: https://gitcode.com/GitHub_Trending/ai/aie-book …...

SEO_五个立竿见影的页面SEO优化技巧指南

SEO优化技巧&#xff1a;快速提升网站页面排名的五个有效方法 在当前竞争激烈的互联网环境中&#xff0c;网站的SEO优化是至关重要的。无论是新建的网站还是已有网站&#xff0c;都需要通过一系列的SEO优化技巧来提升其在搜索引擎上的排名。下面&#xff0c;我们将分享五个立竿…...

【Agents】自定义子代理进阶:后台执行

基础篇&#xff1a;【Agents】Claude Code 多 Agent 入门&#xff1a;从一问一答到并行协作实践篇1:【Agents】Claude Code 自定义子代理&#xff1a;内置的不够用&#xff0c;就自己造实践篇2:【Agents】自定义子代理进阶&#xff1a;沙盒隔离 ​ 上一篇用 isolation: worktre…...