🦄个人主页:修修修也
🎏所属专栏:C++
⚙️操作环境:Visual Studio 2022
string类简介
在实际开发中会经常使用字符串,所谓的字符串就是指一连串的字符,它由许多单个字符连接而成。字符串中可以包含任意任意字符,这些字符必须包含在一对英文双引号( " " )之内,例如"abc"。C++中定义了String类来封装字符串,并提供了一系列操作字符串的方法,它们都位于<string>头文件中。
我们先来看一下https://legacy.cplusplus.com/网站对string类的文档介绍:string类文档
总结如下:
- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名,即:
typedef basic_string<char, char_traits, allocator>string;
- 不能操作多字节或者变长字符的序列。
- 在使用string类时,必须包含#include头文件以及using namespace std;
string类常用接口(成员函数)
📌string类对象默认成员函数
🎏string类对象构造函数
如下,C++98标准中对于string类实现了7个重载的构造函数:string类查询文档
其参数解析如下:
接下来我们演示使用如下四种常见的string类构造函数:
函数名称 功能说明 string() 构造空的string类对象,即空字符串 string(const char* s) 用C-string来构造string类对象 string(size_t n,char c) string类对象中包含n个字符c string(const string&s) 拷贝构造函数
如下代码,分别按上述构造函数顺序调用了相应构造函数初始化了4个string类对象:
#include<iostream> #include<string>using namespace std;int main() {//构造空的string类对象,即空字符串string s1;//用C-string来构造string类对象string s2("hello world");//string类对象中包含n个字符cstring s3(5, 'x');//拷贝构造函数string s4(s2);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;return 0; }
运行程序,构造类对象效果如下:
🎏string类对象析构函数
如下,C++中对于string类实现了1个析构函数:
该函数没有参数,没有返回值,在类对象生命周期结束后自动调用销毁类对象.
🎏string类对象赋值运算符重载函数
如下,C++98标准中对于string类实现了3个重载的赋值运算符重载函数:
接下来我们演示使用这三种常见的string类赋值运算符重载函数:
如下代码,分别按上述赋值运算符重载函数顺序调用了相应赋值运算符重载函数赋值了3次string类对象s4:
int main() {//构造空的string类对象,即空字符串string s1;//用C-string来构造string类对象string s2("hello world");//string类对象中包含n个字符cstring s3(5, 'x');//拷贝构造函数string s4(s2);cout << s4 << endl;s4 = s3;cout << s4 << endl;s4 = "ABCDEF";cout << s4 << endl;s4 = 'Y';cout << s4 << endl;return 0; }
运行程序,赋值运算符重载效果如下:
📌string类对象的迭代遍历及元素访问操作
string类对象的迭代器相关函数共有8个,如下:
string类对象的元素访问相关函数共有四个,如下:
接下来我们演示学习几种常见的string类对象的迭代遍历及元素访问函数:
函数名称 功能说明 operator[] 返回pos位置的字符,const string类对象调用 begin+end begin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器 rbegin+rend begin获取一个字符的迭代器+end获取最后一个字符下一个位置的迭代器 范围for C++支持更简洁的范围for的新遍历方式
🎏operator[]运算符重载
operator[]运算符重载定义:operator[]文档链接
operator[]遍历string类对象:
#include<iostream> #include<string> using namespace std;int main() {string st1("Hello world");for (size_t i = 0; i < st1.size(); i++){cout << st1[i] << endl;}return 0; }
operator[]遍历效果如下:
operator[]修改string类对象:
因为operator[]返回的是引用类型,因此可以利用其对string对象进行修改:
int main() {string st1("Hello world");for (size_t i = 0; i < st1.size(); i++){++st1[i];cout << st1[i] << endl;}return 0; }
operator[]重载访问string类对象和内置类型访问数组成员的区别:
🎏顺序迭代器begin+end
begin+end迭代器顺序遍历访问字符串:
begin()函数定义如下:
end()函数定义如下:
begin+end迭代器顺序遍历访问string类对象:
int main() {string st1("Hello world");//迭代器string::iterator it = st1.begin();while (it != st1.end()){cout << *it << endl;++it;}return 0; }
begin+end迭代器顺序遍历访问效果如下:
begin+end迭代器修改string类对象:
int main() {string st1("Hello world");//迭代器string::iterator it = st1.begin();while (it != st1.end()){++(*it);cout << *it << endl;++it;}return 0; }
begin+end迭代器修改string类对象效果如下:
🎏反向迭代器rbegin+rend
rbegin+rend逆序遍历访问string类对象:
rbegin()函数定义如下:
rend()函数定义如下:
使用rbegin+rend迭代器反向遍历访问string类对象:
int main() {string st1("Hello world");//反向迭代器string::reverse_iterator rit = st1.rbegin();while (rit != st1.rend()){cout << *rit << endl;++rit;}return 0; }
rbegin+rend迭代器反向遍历访问string类对象效果如下:
使用rbegin+rend反向迭代器修改string类对象:
int main() {string st1("Hello world");//反向迭代器string::reverse_iterator rit = st1.rbegin();while (rit != st1.rend()){++(*rit);cout << *rit << endl;++rit;}return 0; }
rbegin+rend反向迭代器修改string类对象效果如下:
🎏范围for
C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量, 第二部分则表示被迭代的范围。(注:知道数据类型的情况下可以不使用auto关键字自动推导类型)
范围for顺序访问string类对象:
int main() {string st1("Hello world");for (auto ch : st1){cout << ch << endl;}return 0; }
范围for顺序访问string类对象效果如下:
范围for修改string类对象:
int main() {string st1("Hello world");for (auto &ch : st1){ch++;cout << ch << endl;}return 0; }
范围for修改string类对象效果如下:
注:范围for在底层会替换成迭代器!
string类对象的容量操作
string类对象容量相关操作函数共有9个,如下:
接下来我们演示学习几种常见的string类对象的容量操作函数:
函数名称 功能说明 size 返回字符串有效字符长度 length 返回字符串有效字符长度 capacity 返回空间总大小 empty 检测字符串释放为空串,是返回true,否则返回false clear 清空有效字符 reserve 为字符串预留空间 resize 将有效字符的个数改成n个,多出的空间用字符c填充
🎏size()函数
size()函数定义:
使用size()函数获取字符串有效字符长度:
int main() {string st1("Hello world");cout << st1.size() << endl;return 0; }
size()函数效果如下:
🎏length()函数
length()函数定义:
使用length()函数获取字符串有效字符长度
int main() {string st1("Hello world");cout << st1.length() << endl;return 0; }
length()函数效果如下:
🎏capacity()函数
capacity()函数定义:
使用cipacity()函数获取string类对象当前存储空间总大小:
int main() {string st1("Hello world");cout << st1.size() << endl;cout << st1.capacity() << endl;return 0; }
capacity()函数效果如下:
关于capacity:
- 不同的编译器底层实现的扩容机制不同,vs初始长度为16,第一次扩容2倍,剩余每次扩容1.5倍;Linux初始长度按初始化的字符串来确定,之后每次扩容2倍
🎏empyt()函数
empty()函数定义:
使用empty()函数判断字符串是否为空串:
int main() {string st1("Hello world");string st2;cout << st1.empty() << endl;cout << st2.empty() << endl;return 0; }
empty()函数效果如下:
🎏clear()函数
clear()函数定义:
使用clear()函数清空字符串:
int main() {string st1("Hello world");cout << st1.empty() << endl;st1.clear();cout << st1.empty() << endl;return 0; }
clear()函数效果如下:
clear对size和capacity的影响:
int main() {string st1("Hello world");cout << st1.size() << endl;cout << st1.capacity() << endl;st1.clear();cout << st1.size() << endl;cout << st1.capacity() << endl;return 0; }
结论是:
一般而言,clear的改变会让size变成0,但不会影响capacity,因为要缩小容量,就需要重新再开辟空间,代价消耗太大,因此一般不会轻易改变capacity的大小:
reserve()函数
reserve()函数定义:
使用reserve()函数更改类对象容量:
reserve()函数效果如下:
resize()函数
resize()函数定义:
使用resize()函数调整字符串大小:
resize()函数效果如下:
注意:
- size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
- clear()只是将string中有效字符清空,不改变底层空间大小。
- resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
- reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。
string类对象的字符串修改操作
string类对象的字符串修改函数共有21个,如下:
常用的字符串修改操作:
函数名称 功能说明 push_back 在字符串后尾插字符c append 在字符串后追加一个字符串 operator+= 在字符串后追加字符串str c_str 返回C格式字符串 find+nops 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 substr 在str中从pos位置开始,截取n个字符,然后将其返回
string类的非成员函数
非成员函数重载共有6个,如下:
常用的非成员函数
函数名称 功能说明 operator+ 尽量少用,因为传值返回,导致深拷贝效率低 operator>> 输入运算符重载 operator<< 输出运算符重载 getline 获取一行字符串 relational operators 大小比较
结语
希望这篇关于C++string类的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.
学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!
相关文章推荐
【C++】构建第一个C++类:Date类
【C++】类的六大默认成员函数及其特性(万字详解)
【C++】内联函数
【C++】函数重载
【C++】什么是类与对象?
【C++】缺省参数(默认参数)
【C++】命名空间
【C++】“Hello World!“
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=33fhaifmbw00o