前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++奇迹之旅:string类对象的容量操作

C++奇迹之旅:string类对象的容量操作

作者头像
学习起来吧
发布于 2024-05-11 00:08:19
发布于 2024-05-11 00:08:19
21100
代码可运行
举报
文章被收录于专栏:学习C/++学习C/++
运行总次数:0
代码可运行

📝 string类的常用接口

string网址查询:https://legacy.cplusplus.com/reference/string/string/

🌉 string类对象的容量操作

函数名称

功能说明

size(重点)

返回字符串有效字符长度

length

返回字符串有效字符长度

capacity

返回空间总大小

empty (重点)

检测字符串释放为空串,是返回true,否则返回false

clear (重点)

清空有效字符

reserve (重点)

为字符串预留空间**

resize (重点)

将有效字符的个数该成n个,多出的空间用字符c填充

🌠size

  1. size—》返回字符串的长度(以字节为单位)。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
size_t size() const;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string str("hello C++");
cout << "The size of str is " << str.size() << endl;

🌠length

  1. length—》返回字符串的长度(以字节为单位)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
size_t length() const;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string str2("hello string");
cout << "The lenth of str2 is " << str2.length() << endl;

string::sizestring::length 是同义词,返回完全相同的值。

🌠capacity

  1. capacity---->返回当前为字符串分配的存储空间的大小,以字节表示。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
size_t capacity() const;

之所以 str.capacity() 的值是 15,是因为 C++ 标准库在创建字符串时会分配一些额外的内存空间来应对未来可能的字符串增长。这个额外的内存空间被称为 “预留空间”。

字符串 "hello C++"10 个字符,但是 C++ 标准库在创建这个字符串时会分配 15 个字符的内存空间。这样可以避免频繁的内存重新分配操作,提高性能,所以 str.capacity() 的值是 15

🌠clear

  1. clear–》擦除字符串的内容,该字符串将变为空字符串(长度为 0 个字符)。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void clear();

clear擦除字符串的内容,该字符串将变为空字符串,长度为0,但是存储空间没有改变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	string s1("hello C++");
	cout << s1 << endl;
	s1.clear();
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	return 0;
}

🌠empty

  1. empty–》返回字符串是否为空(即其长度是否为 0) 此函数不会以任何方式修改字符串的值。若要清除字符串的内容,请看string::clear
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool empty() const;

如果字符串长度为 0,则为 true,否则为 false

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	string str1;// 创建一个空字符串
	string str2 = "Hello, world!"; // 创建一个非空字符串

	if (str1.empty())
	{
		cout << "str1 is empty." << endl;
	}
	else
	{
		cout << "str1 is not empty." << endl;
	}

	if (str2.empty()) 
	{
		std::cout << "str2 is empty." << std::endl;
	}
	else {
		std::cout << "str2 is not empty." << std::endl;
	}
	return 0;
}

🌠reserve

  1. reserve —》为字符串预留空间 std::string::reserve()std::string 类的一个成员函数,用于预先分配内存空间,以提高字符串的性能。

当你需要向字符串中添加大量字符时,使用 reserve() 函数可以避免频繁的内存分配和拷贝操作,从而提高程序的性能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	string str;
	//不使用reserve
	for (int i = 0; i < 1000000; i++)
	{
		str += 'a';
	}
	cout << "size: " << str.size() << ",Capacity: " << str.capacity() << endl;
	
	//使用reserve()
	string str2;
	str2.reserve(1000000);
	for (int i = 0; i < 1000000; i++)
	{
		str2 += 'a';
	}

	cout << "size: " << str2.size() << ",Capacity: " << str2.capacity() << endl;

	return 0;
}

可以看到,在使用 reserve() 函数的情况下,str2 的容量(capacity)与大小(size)相同,而在不使用 reserve() 函数的情况下,str 的容量大于其大小。这就是 reserve() 函数的作用:它可以预先分配内存空间,避免频繁的内存分配和拷贝操作,从而提高程序的性能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str2.reserve(10);//容量不足会怎么样?

当你将 str2.reserve(10) 设置的容量远小于实际需要的容量,输出结果也会显示 Capacity: 1170118。这是因为 std::string 的内部实现机制。 当你使用 reserve() 函数时,它会尝试分配指定大小的内存空间。但是,如果实际需要的空间大于指定的空间,std::string 会自动增加内存空间,以满足实际需求。这个过程称为"内存重新分配"。 即使只预留了 10 个字符的空间,但当你向 str2 添加 1,000,000 个字符时,std::string 会自动增加内存空间,以容纳所有的字符。这就是为什么最终的容量会大于 1,000,000 的原因。 std::string 的容量通常会比实际需要的空间大一些,这是为了提高性能。当需要添加新的字符时,不需要频繁地重新分配内存,从而避免了内存拷贝的开销。

  • 增长策略: 当向 std::string 添加字符时,如果当前容量不足,标准库会自动分配一个更大的内存块。增长策略通常是以当前容量的 2 倍或 1.5 倍来扩展容量,以减少内存重新分配的次数。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//利用reserve提高插入数据的效率,避免增容带来的开销
void TestPushBack()
{
	string s;
	size_t sz = s.capacity();
	cout << "making s grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}
  • 构建vector时,如果提前已经知道string中大概要放多少个元素,可以提前将string中空间设置好
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void TestPushBackReserve()
{
	string s;
	s.reserve(100);
	size_t sz = s.capacity();

	cout << "making s grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

🌉resize

  1. resize —》用来改变 std::string 对象的大小 两种语法:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void resize (size_t n);
void resize (size_t n, char c);
  • 第一种形式的 resize() 函数会将 std::string 的大小设置为 n 个字符,并用默认值 (通常是 '\0') 填充新增的字符。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void resize (size_t n);

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string str = "Hello, world!";
cout << "size: " << str.size() << ",Capacity: " << str.capacity() << endl;
str.resize(20);
cout << "size: " << str.size() << ",Capacity: " << str.capacity() << endl;

可以看出:与 reserve() 函数不同,resize() 函数不仅改变了 std::string 的容量,还改变了它的大小。这意味着,调用 resize() 函数后,std::stringsize()capacity() 函数返回的值都会发生变化。

  1. 将字符串大小设置为 20 个字符,并用字符 'x' 填充新增的部分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string str = "Hello, world!";
str.resize(20, 'x');
cout << str << endl;
  1. 将字符串大小缩小到 5 个字符:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	string str = "Hello, world!";
	str.resize(20, 'x');
	cout << str << std::endl;

注意:如果 n 小于当前 std::string 的大小,则 resize() 函数会截断字符串,删除超出部分的字符。如果 n 大于当前 std::string 的大小,则 resize() 函数会扩展字符串,并用指定的字符填充新增的部分。

🚩总结

  1. size()length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一 致,一般情况下基本都是用size()
  2. clear()只是将string中有效字符清空,不改变底层空间大小。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++指南】string(二):深入探究 C++ `basic_string`:成员变量、函数全解析
在第一篇文章中【C++指南】string(一):string从入门到掌握,我们对 C++ 中 string 的起源、basic_string 模板类以及相关字符串类型有了初步的了解。
倔强的石头
2025/03/15
620
【C++指南】string(二):深入探究 C++ `basic_string`:成员变量、函数全解析
【C++】string类(接口使用详解 上)
cplusplus.com/reference/string/string/?kw=string
羚羊角
2024/10/21
1070
【C++】string类(接口使用详解 上)
​C++ STL 探索:String的使用与理解
在使用string类过程中,必须包括#include头文件以及using namespace std。string类对象支持直接使用cin和cout进行输入和输出。
是店小二呀
2024/08/14
2130
​C++ STL 探索:String的使用与理解
【C++航海王:追寻罗杰的编程之路】string类
在C语言中,字符串是以‘\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串时分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
枫叶丹
2024/06/04
1190
【C++航海王:追寻罗杰的编程之路】string类
string类
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
绝活蛋炒饭
2024/12/16
650
string类
【C++篇】与STL的初见:string类的主要接口简介
接下来我们开始STL的学习之旅,进一步感受C++的给世界带来的编程盛宴。 本章的学习目的:
我想吃余
2025/04/16
850
【C++篇】与STL的初见:string类的主要接口简介
C++从入门到精通——string类
string 类是编程语言中用于表示和操作字符串的基本数据类型或类。它提供了一系列方法和操作,允许开发者对字符串进行创建、修改、查找、比较、转换等。string 类通常具有不可变性,意味着一旦创建了字符串对象,其内容就不能被修改,但可以创建新的字符串对象来表示修改后的内容。这种特性有助于在多线程环境中保持数据的安全性。string 类还提供了各种构造函数、操作符重载和格式化功能,使字符串操作更加灵活和高效。
鲜于言悠
2024/04/30
3610
C++从入门到精通——string类
STL string 实用攻略:打造优质 C++ 代码
C++ 标准模板库:STL 是 C++ 编程语言中的一个重要库,提供了一系列通用的模板类和函数,用于实现常见的数据结构和算法。
秋邱
2025/04/25
930
STL string 实用攻略:打造优质 C++ 代码
【C++】STL--string(上)
C++中的string类是STL中的一个重要的组成部分,string类是一个用于操作字符串的强大工具。
用户11375356
2024/11/22
490
【C++】STL--string(上)
C++中string常用方法总结
📝前言: STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。今天就让我们先学习STL中的重要容器之一——string(文中表粗为重要用法)
用户11029137
2025/03/16
700
C++中string常用方法总结
【C++】string类(上)
(1)字符串是表示字符序列的类,string是表示字符串的字符串类 (2)标准的字符串提供了对此类对象的支持,其接口类似于标准字符容器的接口与常规容器的接口基本相同,但添加了专门用于操作单字节字符字符串的设计特性,也就是专门用来操作string的常规操作 (3)string类是使用char作为它的字符类型 (4)string类是basic_string模版类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数
s-little-monster
2024/08/09
1080
【C++】string类(上)
C++ —— 关于string类
string文档链接:cplusplus.com/reference/string/string/?kw=string
迷迭所归处
2024/11/19
830
C++ —— 关于string类
【深入探索 C++ STL 容器 string】——字符串世界里的神奇魔法棒
https://legacy.cplusplus.com/reference/stl/?kw=stl
换一颗红豆
2024/12/20
1120
【深入探索 C++ STL 容器 string】——字符串世界里的神奇魔法棒
【c++】string类常见接口函数
字符串类是basic_string类模板的一个实例化,它使用char(即字节)作为其字符类型,并使用默认的char_traits和分配器类型
用户11029103
2024/04/16
1560
【c++】string类常见接口函数
【C++】string类初步介绍
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。
zxctscl
2024/03/13
1220
【C++】string类初步介绍
【C++修行之道】string类的使用
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。
走在努力路上的自己
2024/07/13
800
【C++修行之道】string类的使用
string类(上)(解析各种成员函数)
学习string类在编程中是非常重要的,特别是对于使用C++、C#、Java、Python等语言的开发者来说。以下是几个关键原因:
suye
2024/10/16
970
C++【string类,模拟实现string类】
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际 只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
逆向-落叶
2024/11/10
1430
C++【string类,模拟实现string类】
【C++】学习string类:字符操作的艺术
C++的string类是用于处理字符串的标准库类。它定义在头文件中,并位于std命名空间下。C++的string类提供了一系列成员函数和操作符,用于操作和处理字符串。在使用string类时,必须包含#include头文件以及using namespace std; 详情可以点击链接查看——string类文档介绍
大耳朵土土垚
2024/05/24
1190
【C++】学习string类:字符操作的艺术
C++效率掌握之STL库:string函数全解
string作为一个类也有构造函数,析构函数,=运算符重载,我们重点介绍构造函数里的功能
DARLING Zero two
2025/02/05
2490
C++效率掌握之STL库:string函数全解
相关推荐
【C++指南】string(二):深入探究 C++ `basic_string`:成员变量、函数全解析
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验