CD36.【C++ Dev】STL库的string的使用 (下)

目录

1.reserve函数(不是reverse)

代码示例

2.resize

代码示例

3.reserve和resize的区别

4.shrink_to_fit

代码示例

[5.与C语言的配合的接口函数: c_str](#5.与C语言的配合的接口函数: c_str)

代码示例

6.rfind

知识回顾:find函数

rfind

代码示例

[练习题: 字符串最后一个单词的长度](#练习题: 字符串最后一个单词的长度)

代码

提交结果

​编辑


1.reserve函数(不是reverse)

https://legacy.cplusplus.com/reference/string/string/reserve/

如果n>capacity,那么reverse函数会改变capacity

作用:请求改变容量capacity

代码示例

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("teststring");
	cout << "reserve前:"<<str.capacity() << endl;
	str.reserve(20);
	cout << "reserve后:"<< str.capacity() << endl;
	return 0;
}

运行结果:实际上可能多开一点,因为要考虑内存对齐,也有可能开的空间刚刚好

优点:写reserve后,插入少量字符时后面不需要扩容,避免异地扩容消耗时间

有可能reserve的参数大小比原字符串的大小要小,但有字符串的情况下reserve不会缩容,且不会改变size

如果没有字符串的情况下(即空串),可能会缩容,也可能什么都不做,具体和STL的实现有关(因为没有规定要缩容,而且缩容是释放原空间,开辟新的小空间,用时间换空间,代价较大,因此不建议使用与缩容有关的函数)

如果reserve()比capacity小,不同平台的反应不同

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("teststring");
	cout << "reserve前:"<<str.capacity() << endl;
	str.reserve(1);
	cout << "reserve后:"<< str.capacity() << endl;
	return 0;
}

运行结果:

VS2022:

Ubuntu服务器:

2.resize

https://legacy.cplusplus.com/reference/string/string/resize/

resize字面意思理解:"re"+"size",即改变size

代码示例

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("teststring");
	str.resize(4);
	cout <<"str :"<< str << endl;
	cout <<"str.size() :"<< str.size() << endl;
	cout <<"str.capacity() :"<< str.capacity() << endl;
	return 0;
}

运行结果: 字符串被截断处理

截断处理的策略:添加\0,指定字符串的结尾

当resize的参数小于字符串的size时,直接改变size,不会改变capacity

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("teststring");
	cout << "str :" << str << endl;
	cout << "str.capacity() :" << str.capacity() << endl;
	cout << "str.size() :" << str.size() << endl;
	str.resize(20);
	cout <<"str :"<< str << endl;
	cout <<"str.size() :"<< str.size() << endl;
	cout <<"str.capacity() :"<< str.capacity() << endl;
	return 0;
}

运行结果:VS2022平台下,capacity变了

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("teststring");
	cout << "str :" << str << endl;
	cout << "str.capacity() :" << str.capacity() << endl;
	cout << "str.size() :" << str.size() << endl;
	str.resize(13);
	cout <<"str :"<< str << endl;
	cout <<"str.size() :"<< str.size() << endl;
	cout <<"str.capacity() :"<< str.capacity() << endl;
	return 0;
}

运行结果:VS2022平台下,capacity没有变

当resize的参数大于字符串的size时,一定会改变size,有可能会改变capacity,具体情况和编译器的内存分配策略有关

3.reserve和resize的区别

cpp 复制代码
#include <string>
using namespace std;
int main()
{
	string str1;
	str1.reserve(15);
	string str2;
	str2.resize(15);
	return 0;
}

下断点到return 0,打开监视窗口:

区别:reserve只是扩容,而resize是扩容+填值初始化(默认填\0) resize会让size和capacity都变(size变的原因是填值初始化)

4.shrink_to_fit

https://legacy.cplusplus.com/reference/string/string/shrink_to_fit/

shrink v.收缩

shrink_to_fit:收缩至适合

作用:请求减少capacity,让其适合size大小(显然是缩容函数,不建议使用)

请求不一定会执行,具体看编译器的处理策略,即该函数会弹性处理,有可能不会正好是size!

代码示例

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("teststring");
	str.reserve(100);//reserve只是扩容
	cout << "capacity: " << str.capacity() << endl;
	str.shrink_to_fit();
	cout << "capacity: " << str.capacity() << endl;
	return 0;
}

运行结果:

5.与C语言的配合的接口函数: c_str

https://legacy.cplusplus.com/reference/string/string/c_str/

作用:获得C语言版的只读 字符串,好处:一些C语言函数只支持C风格的字符串,提高C++对C语言的兼容性

(注:无论是C++98还是C++11,返回的字符串都是不可以修改的!!!!!!)

代码示例

cpp 复制代码
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
	string str("teststring");
	//注意是const char*,有const修饰
	const char* p = str.c_str();
	printf("%s", p);
	return 0;
}

运行结果:

6.rfind

知识回顾:find函数

参见CC15.【C++ Cont】string类字符串的find和substr函数文章

rfind

https://legacy.cplusplus.com/reference/string/string/rfind/

和find相反,从string类字符串的后面向前面找

代码示例

cs 复制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("abcabcba");
	cout << str.rfind("c");
	return 0;
}

运行结果:

练习题: 字符串最后一个单词的长度

HJ1 字符串最后一个单词的长度

代码

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    getline(cin,str);
    size_t pos = str.rfind(" ");
    if (pos == string::npos)
        cout << str.size();
    else
        cout << str.size() - 1 - pos;
}

因为是"字符串最后一个单词的长度"则可以反向遍历,使用rfind函数,找空格即可,如果没有空格(pos==string::npos),返回str.size()即可

注意:本题不能使用cin读取字符串,cin在遇到空格会停止读取,必须用getline一次读一行

(cin和getline的对比详细参见CC19.【C++ Cont】scanf/printf 和 cin/cout的对比文章)

提交结果

相关推荐
花阴偷移21 小时前
kotlin语法(上)
android·java·开发语言·kotlin
XuanRanDev21 小时前
【编程语言】Kotlin快速入门 - 泛型
开发语言·kotlin
普通网友21 小时前
Android kotlin Jetpack mvvm 项目
android·开发语言·kotlin
Crogin21 小时前
快速简单入门Kotlin——基础语法(第一天)
android·开发语言·kotlin
晨非辰21 小时前
算法闯关日记 Episode :解锁链表「环形」迷局与「相交」奥秘
数据结构·c++·人工智能·后端·python·深度学习·神经网络
qq_3363139321 小时前
java基础-set系列集合
java·开发语言·python
lzhdim21 小时前
C#开发的应用启动菜单应用(普通版) - 开源研究系列文章 - 个人小作品
开发语言·c#
Kyln.Wu21 小时前
【python实用小脚本-309】HR×Python改造面试路线规划|从手工排程到智能调度的化学反应,轻松实现路径优化
开发语言·python·面试
烤麻辣烫1 天前
黑马程序员苍穹外卖(新手)DAY12
java·开发语言·学习·spring·intellij-idea
MM_MS1 天前
C# 线程与并发编程完全指南:从基础到高级带详细注释版(一篇读懂)
开发语言·机器学习·计算机视觉·c#·简单工厂模式·visual studio