vector 不是每次 push_back 都重新分配内存,而是在容量不足时按特定规则扩容。标准未强制要求具体倍数,但主流实现(libstdc++、libc++、MSVC)均采用「约 1.5 倍」或「2 倍」增长,例如 libstdc++ 在多数版本中用 old_capacity + old_capacity / 2(即 1.5 倍),而非简单翻倍。
这意味着:连续插入 n 个元素时,实际内存分配次数是 O(log n) 级别,但每次扩容涉及旧数据拷贝,代价不可忽略。若已知大致规模,应优先调用 reserve() 预留空间。
reserve(100) 只改变 capacity(),不改变 size()
resize(100) 会将 size() 设为 100,必要时默认构造新元素,也可能触发扩容vector 要格外小心——它是特化模板,底层常以位为单位存储,data() 不可用,迭代器行为也不同遍历时核心关注点是:是否需要索引、是否可能修改元素、是否在循环中增删元素。错误的遍历方式极易导致越界或迭代器失效。
for (const auto& x : v) { /* 只读 */ } 或 for (auto& x : v) { x = ...; /* 可写 */ } —— 但无法获取下标,且不能在循环体内调用 push_back 或 erase
operator[] 或 at())适合需下标逻辑:for (size_t i = 0; i < v.size(); ++i) { v[i] *= 2; } 注意 v.at(i) 会做边界检查并抛 std::out_of_range,而 v[i] 不检查erase 返回的新迭代器:for (auto it = v.begin(); it != v.end(); ) { if (*it % 2 == 0) it = v.erase(it); else ++it; } 直接 ++it 后 erase(it) 是未定义行为这是最容易被忽视的陷阱。只要发生扩容(包括隐式扩容),所有指向该 vector 元素的 iterator、pointer、reference 都变为悬空(dangling),后续解引用必出错。
p 是未定义行为:std::vectorv = {1, 2, 3}; int* p = &v[0]; v.reserve(100); // 可能触发扩容 printf("%d", *p); // 危险!p 已失效
size_t idx)代替指针;或确保在生命周期内不扩容(如提前 reserve 并不再插入)data() 返回的指针同样遵循此规则:仅当 !empty() 且未扩容时有效clear() 仅销毁所有元素并将 size() 置为 0,capacity() 保持不变。想真正归还内存给系统,需调用 shrink_to_fit() —— 但它只是请求,标准允许实现
忽略该请求。
v.clear(); std::vector(v).swap(v); // 强制释放内存
shrink_to_fit 或 swap 技巧可能带来额外开销,应权衡内存与性能需求vector 的动态性便利背后藏着几处硬约束:扩容时机不可控、迭代器易失效、内存释放非自动。写代码时别只盯着 push_back 和 size(),多看一眼 capacity(),少用裸指针存元素地址,遍历时避开边循环边修改的惯性操作。
# c++
# for
# 循环
# 指针
# operator
# pointer
# 对象
# 迭代
# 遍历
# 特化
# 这是
# 也不
# 是在
# 设为
# 适用于
# 它是
# 能在
相关文章:
建站之星官网登录失败?如何快速解决?
如何通过PHP快速构建高效问答网站功能?
大连网站制作公司哪家好一点,大连买房网站哪个好?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
网站制作公司,橙子建站是合法的吗?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
高端企业智能建站程序:SEO优化与响应式模板定制开发
东莞专业制作网站的公司,东莞大学生网的网址是什么?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
网站设计制作企业有哪些,抖音官网主页怎么设置?
建站VPS选购需注意哪些关键参数?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
活动邀请函制作网站有哪些,活动邀请函文案?
网站网页制作专业公司,怎样制作自己的网页?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
如何访问已购建站主机并解决登录问题?
简单实现Android验证码
网站插件制作软件免费下载,网页视频怎么下到本地插件?
如何确保西部建站助手FTP传输的安全性?
招贴海报怎么做,什么是海报招贴?
如何用PHP工具快速搭建高效网站?
如何在IIS7中新建站点?详细步骤解析
如何自定义建站之星网站的导航菜单样式?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何基于云服务器快速搭建个人网站?
北京企业网站设计制作公司,北京铁路集团官方网站?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
如何在建站之星绑定自定义域名?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
网站好制作吗知乎,网站开发好学吗?有什么技巧?
如何在服务器上配置二级域名建站?
建站之星收费标准详解:套餐费用及年费价格表一览
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何在腾讯云服务器上快速搭建个人网站?
创业网站制作流程,创业网站可靠吗?
宝塔Windows建站如何避免显示默认IIS页面?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
已有域名和空间如何搭建网站?
济南网站制作的价格,历城一职专官方网站?
C#如何使用XPathNavigator高效查询XML
Android滚轮选择时间控件使用详解
如何在Windows服务器上快速搭建网站?
高性价比服务器租赁——企业级配置与24小时运维服务
如何用搬瓦工VPS快速搭建个人网站?
如何批量查询域名的建站时间记录?
建站之星安装模板失败:服务器环境不兼容?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星客服服务时间及联系方式如何?
北京制作网站的公司,北京铁路集团官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。