0

0

C++中的std::vector::reserve和resize的区别?(预留空间与修改大小)

穿越時空

穿越時空

发布时间:2026-01-09 13:03:09

|

534人浏览过

|

来源于php中文网

原创

reserve只改变capacity不改变size;调用后不能通过下标访问新预留位置,否则越界;resize(n,val)才真正增加size并允许安全访问[0,n)下标。

c++中的std::vector::reserve和resize的区别?(预留空间与修改大小)

reserve 只改变容量,不改变 size

reserve 的作用是提前为 std::vector 分配足够大的内存块,避免后续多次 push_back 触发扩容重分配。它只影响 capacity(),对 size() 完全没影响——也就是说,调用后你仍然不能通过下标访问新预留的位置,vector 里还是原来那些元素。

常见错误是以为 reserve(10) 后就能写 v[5] = 42,结果触发越界访问(未定义行为)。

  • reserve(n):确保 capacity() >= n;若当前 capacity() ,则重新分配内存,但不构造新元素
  • 调用前后 size() 不变,所有已有元素位置不变(迭代器不失效,除非发生重分配)
  • 适用于已知将要插入大量元素的场景,比如循环前预估总数

resize 改变 size,可能也改变 capacity

resize 是真正“修改容器大小”的操作:它调整 size(),并按需构造或销毁元素。如果新大小大于当前 size(),会默认构造新增元素(或用指定值填充);如果更小,则析构尾部多余元素。

它不保证扩容,但如果新 size() 超过当前 capacity(),底层仍会触发一次 reserve 式的内存分配(并构造新元素)。

立即学习C++免费学习笔记(深入)”;

  • resize(n):使 size() == n;若 n > size(),追加 n - size() 个默认构造对象
  • resize(n, val):追加 n - size() 个值为 val 的副本
  • 调用后可安全访问 [0, n) 范围内任意下标(只要 n )
  • 频繁 resize 小步增长(如每次 +1)性能差,因可能反复分配+拷贝

为什么不能用 reserve 替代 resize 来“初始化空间”

因为 reserve 不调用任何元素的构造函数,内存只是被分配、未被初始化。此时 vectordata() 指针所指区域是“原始内存”,直接读写 operator[]at() 会访问未构造对象,属于未定义行为。

X Detector
X Detector

最值得信赖的多语言 AI 内容检测器

下载

例如:

std::vector v;
v.reserve(5);
// ❌ 错误:v[0] 访问未构造的 std::string 对象
// ✅ 正确:先 resize,再赋值,或用 insert/emplace_back
  • 内置类型(如 int)看似能写,但仍是未定义行为(C++20 起明确禁止)
  • std::vector 是特化,reserve 行为更复杂,不建议依赖
  • 想预分配+初始化,应直接 resize(n)assign(n, val)

实际组合使用的典型模式

高频场景是“先 reserve 预估总量,再循环 push_back”,兼顾效率与语义清晰。比如从文件读取不确定数量的记录:

std::vector records;
records.reserve(expected_count); // 避免中间多次 realloc
for (auto& line : lines) {
    records.push_back(parse(line)); // 构造并添加,不额外拷贝
}

注意:如果 expected_count 严重低估,仍会发生扩容;高估则浪费内存但无副作用。而 resize 在这种场景下会导致构造大量无用临时对象,再逐个赋值,开销更大。

真正需要“固定大小+可随机写入”的场合(如图像缓冲区),通常更适合用 std::array 或裸 new[] + RAII 封装,而非 vector

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号