IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++String类成员函数辨析】resize()size()capacity()reserve()函数的解析与对比 -> 正文阅读

[C++知识库]【C++String类成员函数辨析】resize()size()capacity()reserve()函数的解析与对比

朋友们好,这篇播客我们继续C++的初阶学习,现在对我们对C++的string类中的几个内存空间函数做出总结对比,整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!

一:size()、length()与capacity()

这几个函数相对来说还是很好理解,我们就不对其再做具体介绍,看一段代码即懂!
??代码示例:

void TestString01(){
	string s("hello pxl!!!");

	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout <<"s:" << s << endl;

	cout << "**************************" << endl;
	s.clear();
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << "s:" << s << endl;
}
int main(){
	TestString01();
	system("pause");
	return 0;
}

??:结果输出

12
12
15
s:hello pxl!!!
**************************
0
0
15
s:
请按任意键继续. . .

代码解释:size和length函数的功能都是计算字符串大小,capacity函数计算为字符串分配的内存空间。尽管我们调用clear()函数清空了字符串内容,但是其容量依然不变!!!

二:resize()函数

在这里插入图片描述
😮:函数解析:

  1. 将字符串大小调整为n个字符的长度。
  2. 如果n小于当前字符串长度,则当前值将缩短为其第一个n个字符,删除超过n个字符的字符。
  3. 如果n大于当前字符串长度,则通过在末尾插入所需数量的字符来扩展当前内容,以达到n的大小。如果指定了c,则新元素初始化为c的副本,否则,它们是值初始化字符(空字符)。
  4. 如果n大于当前字符串内存空间的容量,则内存载自动扩容,以能够满足n的大小。如果指定了c,则新元素初始化为c的副本,否则,它们是值初始化字符(空字符)。

以下分别对上述几种情况做出代码示例:
1??

void TestString01(){
	string s("hello pxl!!!");

	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout <<"s:" << s << endl;

	cout << "**************************" << endl;
	s.resize(9, 'a');
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << "s:" << s << endl;
}
int main(){
	TestString01();
	system("pause");
	return 0;
}

12
12
15
s:hello pxl!!!
**************************
9
9
15
s:hello pxl
请按任意键继续. . .

代码解释:当resize的参数n小于字符串长度时,重新调整字符串大小为n,源字符串多出部分被截取掉,字符串长度相应变小,但是容量不会减容!!!
2??:

void TestString01(){
	string s("hello pxl!!!");

	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout <<"s:" << s << endl;

	cout << "**************************" << endl;
	s.resize(15, 'a');
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << "s:" << s << endl;
}
int main(){
	TestString01();
	system("pause");
	return 0;
}


12
12
15
s:hello pxl!!!
**************************
15
15
15
s:hello pxl!!!aaa
请按任意键继续. . .

代码解释:当resize()的参数n大于当前源字符串长度,小于等于容量时,就在源字符串后追加参数‘a’,以达到重新调整的字符串大小!!!
3??:

void TestString01(){
	string s("hello pxl!!!");

	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout <<"s:" << s << endl;

	/*cout << "**************************" << endl;
	s.clear();
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << "s:" << s << endl;*/

	cout << "**************************" << endl;
	s.resize(20, 'a');
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << "s:" << s << endl;
}
int main(){
	TestString01();
	system("pause");
	return 0;
}

12
12
15
s:hello pxl!!!
**************************
20
20
31
s:hello pxl!!!aaaaaaaa
请按任意键继续. . .

代码解释:当resize()的参数n大于当前容量时,这时候编译器会自动扩展容量,然后再在源字符串后追加参数‘a’,以达到重新调整的字符串大小!!!

三:reserve()函数

在这里插入图片描述
😮:函数解析:

  1. 请求调整字符串容量以适应计划中的大小更改,最大长度为n个字符。
  2. 如果n大于当前字符串容量,则函数会使容器将其容量增加到n个字符(或更大)。
  3. 此函数对字符串长度没有影响,并且无法更改其内容。

??代码示例:

void TestString02(){
	string s("hello pxl!!!");
	cout << s.capacity() << endl;

	s.reserve(100);
	cout << s.size() << endl;
	cout << s.capacity() << endl;

}
int main(){
	TestString02();
	system("pause");
	return 0;
}

结果输出:
15
12
111
请按任意键继续. . .

代码解释:我们在初始化一个字符串,当还没有调用reserve函数时,其容量为15,大小为12,当主动调用reserve函数后,使容器将其容量增加到n个字符(或更大)。

🍎:我们思考当reserve参数小于string的底层空间大小时,是否会将空间缩小?
??代码示例:

void TestString02(){
	string s("hello pxl!!!");
	cout << s.capacity() << endl;

	s.reserve(100);
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	cout << "**************************" << endl;
	s.reserve(50);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
}
int main(){
	TestString02();
	system("pause");
	return 0;
}

结果输出:
15
12
111
**************************
12
111
请按任意键继续. . .

代码解释:我们先后主动调用reserve函数后,使第一次的参数大于第二次,结果发现:当reserve参数小于string的底层空间大小时,并不会将空间缩小。

总结

1??.size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
2??.clear()只是将string中有效字符清空,不改变底层空间大小
3??.resize(size_t n)与resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时: resize(n)用”空格“来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意: resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
4??. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小

谢谢大家浏览!!!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 16:45:42  更:2022-06-26 16:45:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 11:45:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码