C++学习笔记(14)——string的库函数reserve、resize

本文介绍了C++中字符串对象的内存管理方法,reserve用于预分配空间以避免频繁扩展,resize则用于直接操作对象已使用的空间,讨论了两者的行为和可能的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章

http://t.csdnimg.cn/u80hL


一、reserve——请求容量的变化

  1. 改变对象的capacity——他会请求开辟和缩小对象所占的空间,reserve只能操作对象未使用的空间;
  2. 其存在意义为:因为开辟空间的操作所消耗的资源太多了,所以在知道需要多少空间的前提下请求提前一次性开辟一个确定够用的空间,避免反复开空间;
  3. reserve请求实际开辟的空间大小会大于或等于我们给出的数值,具体值根据不同的编译器有所不同,如g++会给等于数值大小的空间、visual会给数值1.5倍大小的空间;
  4. 如果对象已经使用了空间,而我们使用reserve请求变化的空间值小于对象使用的空间,会有两种情况:
    情况1:请求的新空间大于等于对象已经使用的空间大小,此时编译器会在保留对象已经使用的空间不受干扰的情况下,去释放对象没有使用的空间;
    情况2:请求的新空间小于对象已经使用的空间大小,此时编译器会将空间缩小到刚好存储对象已经使用空间大小;

如代码所示,请求开辟较大的空间、请求缩小空间:

#include<iostream>
using namespace std;
int main() 
{
	//reserve
	string s1;	//定义一个对象
	s1 = "0123456789";
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	cout << endl;

	s1.reserve(30);	//给这个对象请求更大的空间使用权
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	cout << endl;

	s1.reserve(15);	//请求给对象更小的使用权
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

在这里插入图片描述

ps. 在实践时我发现,编译器会优化我们的 reserve()请求,编译器会根据具体的情况决定要不要执行我们的开拓和缩小请求。

二、resize——操作对象使用的空间

  1. 通过resize我们可以直接操作对象使用的空间,这种操作是强硬的;
  2. resize的操作会有3种情况:

情况1:resize的空间大于原size和capacity,此时原size会被扩大到新的size大小,那些没有实质内容的空间可以指定一种字符去填充,如果没有指定则会自动用’\0’填充,而capacity会自动扩容直到可以包括下新的size;

情况2:resize的空间大于原size而小于capacity,此时原size会被扩大到新的size大小,那些没有实质内容的空间可以指定一种字符去填充,如果没有指定则会自动用’\0’填充,capacity保持不变;

情况3:resize的空间小于原size,此时编译器会舍去不在新size存储空间里面的信息,而capacity不做改变;
如下代码,使用resize()扩大和缩小对象空间使用。

void test2()
{
	string s2;	//定义一个对象
	s2 = "0123456789";
	cout << s2 << endl;
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;
	cout << endl;

	s2.resize(20);
	cout << s2 << endl;
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;
	cout << endl;

	s2.resize(5);
	cout << s2 << endl;
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;
	cout << endl;
}

在这里插入图片描述

### 关于 UniApp 框架的推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构和技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计和实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub 和 GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值