💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
- 一、初识
- 二、概述
- 三、string类的常见接口
- 1.默认成员函数
- (1)构造函数
- (2)析构函数
- (3)赋值重载函数
- 2.容量相关函数
- (1)size、length、capacity
- (2)max_size
- (3)clear和empty
- (4) reserve
- (5) resize
前言:
在C语言中,string是一种字符串你类型,在C++中,我们充分利用OOP特性,让我们一起来学习STL中的string类吧!
一、初识
- string意为字符串,那回忆一下我们在C语言阶段所学习的字符串,是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些string系列的库函数。但是这些库函数与字符串是分离开的,不太符合 OOP 的思想,而且底层空间需要用户自己管理,十分不方便。
因此,在C++中专门搞出了一个与字符串相关的类,我们知道C++是面向对象的,我们可以在类内去写各种成员函数来对外提供操作字符串的接口,这个类就是string类
下图是STL容器中的内容:
你会发现在C++的容器里面并没有string。
- 其实,string的历史比较久远,在C++的容器里面并没有string,因为它是在STL之前就已经存在了的,属于C++标准库里的内容。
二、概述
查询C++网站,如下:
-
string在底层实际是:basic_string模板类的别名,typedef
basic_string
<char, char_traits, allocator> string; -
string是表示字符串的字符串类
-
该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
-
不能操作多字节或者变长字符的序列。
-
在使用string类时,必须包含
#include
< string >头文件,并使用std::
包含。
三、string类的常见接口
1.默认成员函数
函数名称 | 功能说明 |
---|---|
constructor | 构造函数 |
destructor | 析构函数 |
operator= | 赋值重载 |
(1)构造函数
构造函数一共有7个重载,其中1,2,3
比较常用。
1.string(); // 构造一个空字符串
2.string (const char* s); // 用C-string来构造string类对象
3.string (const string& str); // 利用原先的字符串做拷贝构造
4.string (const char* s, size_t n); // 用C-string的前n个字符来构造string类对象
5.sring (size_t n, char c); // 生成n个c字符的字符串
// 拷贝str字符串中从pos位置开始的len个字符
6.string (const string& str, size_t pos, size_t len = npos);
将上面六种构造函数演示一下!
通过这个实例很清楚搞明白了,其中第三个就是【拷贝构造
】,但是第6个中的npos
的意思你可能不知道代表什么~
6.string (const string& str, size_t pos, size_t len = npos)
- npos: 无符号整数的最大值
- pos:指定下表位置
(2)析构函数
析构函数一般默认调用
~String();
(3)赋值重载函数
整理一下也就是下面3种类型:
string& operator= (const string& str); // 将一个string对象赋值给到另一个
string& operator= (const char* s); // 将一个字符串赋值给到string对象
string& operator= (char c); // 将一个字符赋值给到string对象
实例运行一下-
2.容量相关函数
一共有下面这几种
函数名称 | 功能说明 |
---|---|
size | 返回字符串有效字符长度 |
length | 返回字符串有效字符长度 |
capacity | 返回空间总大小 |
maxsize | 返回字符串的最大长度 |
clear | 清空有效字符 |
empty | 检测字符串释放为空串,是返回true,否则返回false |
reverse | 为字符串预留空间 |
resize | 将有效字符的个数该成n个,多出的空间用字符c填充 |
shrink_to_fit | 收缩到合适大小 |
(1)size、length、capacity
比较上面两幅图,对于size和length,他们的返回结果都是返回当前字符串中存放了多少字符,\0结束
。但是在C++中,我们通常使用【size
】即可,因为其他STL库中的接口使用的也是【size】。
而capacity:表示当前这个字符串可容纳的空间数。
总结:
- 1.lenght和size,通常使用size。
- 2.size:表示当前字符串中存放了多少字符。
- 3.capacity:表示当前这个字符串可容纳的空间数。
- 4.string的扩容机制:在
Windows
下的VS中,扩容的大小是呈现一个1.5倍
大小的趋势,而且在vs编译器中,它的初始大小是15,超过15个字符后开始1.5倍扩容;可是在Linux
平台下呈现的却是2倍
大小的趋势
(2)max_size
这个函数的作用就是返回字符串能达到的最大长度。
- vs中是2147483674.
(3)clear和empty
实例运行一下:
- 通过上面两幅图,可以得出:
clear
:擦除字符串的内容,使其成为空字符串(长度为0个字符)。并不会去清空这个【capacity】容量的大小。
实例运行一下:
empty
:返回字符串是否为空,(即其长度是否为0)。
没被清空的时候返回0,代表false不空; 而被清空之后返回1,代表true为空
(4) reserve
这个reserve就相对复杂一些了,然我们一起慢慢学习~
- 首先,
reserve
简单来说可以提前为一个字符串开出指定大小
的空间。
- 但是,它并不一定开辟出指定大小的空间,可能大可能小【
non-binding
】,如上图文档所说。
实例运行:在windows的vs2019下发现确实是这样。
- 总结来说:在
Windows
下,实际给的容量与你指定的可能会不相符。但是,在Linux
下实际给容量的等于你指定的大小。
(5) resize
- 简单来说,
resize
:将字符串大小调整为n个字符的长度。
实例运行:
- 可以发现,
reserve
只是扩充了容量,但是里面并没有填充字符。而resize
是不但扩充了容量,并且填充指定数量的字符,默认是‘\0’
。而且同样遵循在Windows
和Linux
的指定扩充大小与实际不符的请情况。
resize还有一个特别的地方:
-
1️⃣ 如果 n > 当前的字符串长度,则在末尾插入所需数量的字符【通常默认是
‘\0’
,也可以指定字符】以达到n的大小来扩展当前内容
🔸指定填充字符的函数void resize (size_t n, char c);
char c:就是要指定的字符。 -
2️⃣ 如果n < 当前的字符串长度,则会去进行一个删除的操作,删除第n个字符之后的字符,产生截断