新闻中心
C++ vector容器怎么使用_C++ STL vector常用函数与扩容机制详解

在C++ STL中,vector 是最常用的一种序列式容器,它封装了动态数组,能够自动管理内存,支持快速随机访问,并且可以在尾部高效地插入和删除元素。本文将详细介绍 vector 的基本使用方法、常用函数以及其背后的扩容机制。
vector 基本定义与初始化
要使用 vector,需要包含头文件
常见初始化方式包括:
-
空容器:
std::vector<int> vec;</int> -
指定大小:
std::vector<int> vec(5);</int>(创建5个默认值为0的int) -
指定大小和初始值:
std::vector<int> vec(5, 10);</int>(5个10) -
用另一个容器初始化:
std::vector<int> vec2(vec1);</int> -
用初始化列表(C++11):
std::vector<int> vec = {1, 2, 3, 4};</int>
常用成员函数详解
vector 提供了丰富的接口来操作数据,以下是开发中最常使用的函数:
1. 元素访问-
vec[i]:直接访问第 i 个元素,不检查越界 -
vec.at(i):访问第 i 个元素,会做越界检查,越界抛出std::out_of_range -
vec.front():返回第一个元素 -
vec.back():返回最后一个元素 -
vec.data():返回指向内部数组首元素的指针,可用于 C 风格接口
-
vec.size():当前元素
个数 -
vec.empty():判断是否为空,比size() == 0更推荐 -
vec.capacity():当前分配的存储空间能容纳多少元素 -
vec.resize(n):调整大小,若 n > size 则补默认值;n -
vec.reserve(n):预分配至少 n 个元素的空间,避免频繁扩容 -
vec.shrink_to_fit():请求释放未使用的内存(C++11)
-
vec.push_back(x):尾部插入一个元素 -
vec.pop_back():删除最后一个元素 -
vec.insert(it, x):在迭代器 it 指向位置前插入元素 x -
vec.erase(it):删除 it 指向的元素,或删除区间 [first, last) -
vec.clear():清空所有元素 -
vec.swap(another_vec):与另一个 vector 交换内容,常数时间
vector 扩容机制解析
vector 的底层是一段连续的内存空间。当插入元素导致当前容量不足时,会触发扩容机制。
扩容过程如下:
- 申请一块更大的内存空间(通常是原容量的 1.5 倍或 2 倍,具体由编译器实现决定)
- 将原有元素逐个拷贝或移动到新空间
- 释放旧内存
- 更新内部指针指向新内存
不同编译器策略略有差异:
- GCC(libstdc++)通常以 2 倍扩容
- MSVC 和 Clang(libc++)可能采用 1.5 倍增长策略,更节省内存
扩容是昂贵的操作,应尽量避免频繁发生。建议:
达芬奇
达芬奇——你的AI创作大师
166
查看详情
- 如果能预估元素数量,提前调用
reserve() - 避免在循环中不断 push_back 而不 reserve
例如:
std::vectorvec.reserve(1000); // 预分配空间
for (int i = 0; i vec.push_back(i);
}
这样可确保只分配一次内存,效率更高。
迭代器失效问题
由于扩容会改变内存地址,所有指向 vector 的迭代器、指针、引用在扩容后都会失效。
- insert / push_back 导致扩容:所有迭代器失效
- erase 删除元素:被删元素及之后的迭代器失效
- pop_back:尾部迭代器失效
编程时需注意避免使用已失效的迭代器,否则行为未定义。
性能特点与适用场景
vector 的优势:
- 支持 O(1) 随机访问
- 内存连续,缓存友好
- 尾插尾删效率高(摊销 O(1))
- 与 C 数组兼容性好
不适合的场景:
- 频繁在中间插入/删除(需移动大量元素)
- 需要保证指针长期有效(扩容会失效)
对于这类需求,可考虑 list 或 deque。
基本上就这些。掌握 vector 的使用和原理,是 C++ 开发的基础能力。以上就是C++ vector容器怎么使用_C++ STL vector常用函数与扩容机制详解的详细内容,更多请关注其它相关文章!
# 更高
# 北京先进网站建设方法
# 湖南长沙腾讯网站建设
# 卡盟刷赞网站推广永久
# 陆丰关键词排名
# 柳林附近网站推广
# 开封鹤壁网站建设
# 权威的seo网站优化
# 餐饮营销怎样推广产品
# seo 推seo
# 湘潭seo网站运营
# c++
# 中文网
# 这类
# 相关文章
# 而不
# 第一个
# 返回值
# 更大
# 迭代
# 达芬奇
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
解决深度学习模型训练初期异常高损失与完美验证准确率问题
必由学官方平台入口 必由学在线课堂登录地址
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
海棠电脑版入口_通过电脑访问海棠官网阅读
excel如何生成目录 excel一键生成工作表目录超链接
Pandas DataFrame 多条件优先级排序与排名
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
J*aScript中正确使用querySelectorAll与复杂CSS选择器
Angular中父组件异步更新子组件复选框状态的实践指南
从OpenAI API响应中高效提取生成文本
Win10双系统截图高效法 截屏快捷键速记【技巧】
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
Python:递归比较文件夹内容并找出特定类型文件的差异
理解J*aScript Promise的微任务队列与执行顺序
汽车之家官方网站官网入口_汽车之家网页版直接进入
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
Go语言中Map值调用指针接收器方法的限制与应对
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
在Pyomo中实现基于变量的条件约束:Big-M方法详解
Go调试环境为何无法启动_Go调试器启动失败原因与解决策略
《主播少女的秘密账号迷宫》首支宣传片
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
Centos/Linux 系统下安装 composer 的完整步骤
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
C++ explicit关键字防止隐式转换_C++构造函数安全规范
在python-socketio事件处理器中安全访问Flask应用上下文
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
qq音乐在线播放入口_qq音乐电脑版登录链接
抖音网页版平台入口 抖音网页版官网在线访问教程
免费抖音短视频入口_抖音网页版短视频免费通道
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
快手赚钱渠道_快手收益来源
蛙漫2台版漫画地址 Manwa2正版网页版链接
顺丰快件物流信息 官方网站查询入口


2025-12-16
浏览次数:次
返回列表
个数