导读:本期聚焦于小伙伴创作的《C++中string的resize和reserve方法有什么区别?如何正确调整字符串内存与长度》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++中string的resize和reserve方法有什么区别?如何正确调整字符串内存与长度》有用,将其分享出去将是对创作者最好的鼓励。

在C++标准库中,std::string提供了resizereserve两个用于调整字符串状态的方法,二者都涉及内存操作,但核心功能和使用场景有明显区别,理解这些差异是做好字符串内存管理的基础。

C++中string的resize和reserve方法有什么区别?如何正确调整字符串内存与长度

resize和reserve的核心差异

resize的核心作用是调整字符串的有效长度,同时可能会触发内存分配;reserve的核心作用是调整字符串的容量,也就是预分配内存空间,不会改变字符串的有效长度。

resize方法详解

resize方法有两种常用重载形式:

  • void resize(size_t n):将字符串长度调整为n,如果n大于当前长度,新增的部分用空字符填充;如果n小于当前长度,字符串会被截断。
  • void resize(size_t n, char c):将字符串长度调整为n,如果n大于当前长度,新增的部分用字符c填充;如果n小于当前长度,字符串会被截断。

resize的目标长度n超过当前字符串的容量时,会触发内存重新分配,容量会至少扩大到n;如果n小于等于当前容量,通常不会触发内存重新分配。

下面是resize的使用示例:

#include <iostream>
#include <string>

int main() {
    std::string s = "hello";
    std::cout << "初始长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;

    // 长度扩大到8,新增部分用空字符填充
    s.resize(8);
    std::cout << "resize(8)后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
    // 输出字符串,空字符不会显示
    std::cout << "内容: " << s << std::endl;

    // 长度扩大到10,新增部分用'x'填充
    s.resize(10, 'x');
    std::cout << "resize(10, 'x')后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
    std::cout << "内容: " << s << std::endl;

    // 长度缩小到3,截断字符串
    s.resize(3);
    std::cout << "resize(3)后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
    std::cout << "内容: " << s << std::endl;
    return 0;
}

reserve方法详解

reserve方法的作用是请求字符串的容量至少达到指定的大小,其函数原型为:

void reserve(size_t n = 0)

当n大于当前容量时,会重新分配内存,将容量扩大到至少n;当n小于等于当前容量时,通常不会缩小容量,不同编译器实现可能有差异,标准没有强制要求缩小容量。

需要注意的是,reserve不会改变字符串的有效长度,调用后size()的返回值不会变化,只是预分配了内存,避免后续追加字符时频繁触发内存重新分配。

下面是reserve的使用示例:

#include <iostream>
#include <string>

int main() {
    std::string s = "hello";
    std::cout << "初始长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;

    // 预分配容量为20
    s.reserve(20);
    std::cout << "reserve(20)后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
    std::cout << "内容: " << s << std::endl;

    // 追加字符,不会触发内存重新分配,因为容量足够
    for (int i = 0; i < 10; ++i) {
        s.push_back('a');
    }
    std::cout << "追加10个字符后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;

    // 请求容量缩小到5,通常不会生效
    s.reserve(5);
    std::cout << "reserve(5)后长度: " << s.size() << ", 容量: " << s.capacity() << std::endl;
    return 0;
}

二者的对比总结

为了更清晰地区分两个方法,我们可以从以下几个维度对比:

对比维度resizereserve
核心作用调整字符串有效长度调整字符串容量(预分配内存)
对size()的影响会改变,等于传入的参数n(除非n小于原长度)无影响,size()保持不变
对capacity()的影响可能改变,当n超过当前容量时会扩大可能改变,当n超过当前容量时会扩大
是否填充字符是,新增部分用指定字符或空字符填充否,只分配内存不改变内容
典型使用场景需要明确设置字符串长度,或者截断字符串提前预分配内存,避免频繁扩容提升性能

使用注意事项

  • 不要混淆长度和容量:长度是字符串当前有效字符的个数,容量是已分配的内存能容纳的字符个数,resize改变长度,reserve改变容量。
  • 调用resize(n)后如果n大于原长度,新增的位置是空字符,不是空格,输出时不会显示,如果需要填充其他字符要使用带第二个参数的重载。
  • reserve预分配的内存只是建议,编译器可能会分配比请求更大的容量,不同标准库实现的扩容策略不同。
  • 如果需要缩小字符串的容量,可以使用shrink_to_fit方法,不过该方法也是请求缩小,不保证一定生效。
在实际开发中,如果需要频繁向字符串追加字符,提前用reserve预分配足够的容量可以减少内存重新分配的次数,提升程序性能;如果需要调整字符串的实际内容长度,再使用resize方法。

C++_stringresizereserve内存管理长度调整修改时间:2026-07-11 12:03:40

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。