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个字符c string 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个字符c string 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[]遍历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迭代器顺序遍历访问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逆序遍历访问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类对象效果如下:
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()与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类的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.
学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!