目录
大家可以去 cplusplus.com 中详细了解一下string类的文档介绍。
总结:
- string 是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作 string 的常规操作。
- string 在底层实际是: basic_string 模板类的别名
- 不能操作多字节或变长字符的序列.
| (constructot) 函数名称 | 功能说明 |
| string () (重点) | 构造空的string类对象,即空字符串 |
| string(const string& s) (重点) | 拷贝构造函数 |
| string(const char* s) (重点) | 用C-string 来构造string类对象 |
| string (const string& str,size_t pos,size_t len =npos) | 从pos位置开始拷贝到npos位置 |
| string(size_t n,char c) | string类对象中包含n个字符c |
接下来我们使用以上5中常见的构造方式来创建5个对象。

特别注意,关于第四个构造方式中的缺省值npos,它的值为 -1,又因为 npos 为 size_t 无符号整形,所以其是一个很大的数(全1),所以如果我们不给截至位置,可以理解为拷贝到字符串结束。

当然,string 类也是可以支持隐式类型的转换的。

这种方式的本质是隐式类型的转化,在前面讲解explicit 关键字例子时对这有过讲解,本质是相同的。
| 函数名称 | 功能说明 |
| size (重点) | 返回字符串有效字符长度 |
| length | 返回字符串有效字符的长度 |
| capacity | 返回空间总大小 |
| empty (重点) | 检测字符串释放是否为空串 |
| 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 n=0) : 为 string 预留空间,不改变有效元素个数,当 reserve 的参数小于 string 的底层空间总大小时,reserver 不会改变容量大小。



一个场景:遍历一遍字符串,并将其中一个字符+1


目前在string中,它的使用类似于指针(不一定是指针)。
迭代器的使用

使用方式:

这里举例三种常用的 string 插入方式,这里附上文档和使用举例,比较简单,就不多讲解了。

使用举例:




使用方法:

以上的这些方式都是从字符串的末尾开始插入数据的,接下来我们学习在string任意位置删除字符的函数。


使用举例:

使用C语言的方式 打印出文件中的内容
c_str : 返回一个指向数组的指针,该数组包含以 null 结尾的字符序列(即 C 字符串),表示字符串对象的当前值。
- void test10()
- {
- string filename("test.cpp");
- FILE* fout = fopen(filename.c_str(), "r");
- assert(fout);
- char ch = fgetc(fout);
- while (ch != EOF)
- {
- cout << ch;
- ch = fgetc(fout);
- }
- }
两者之间的差别

如果我们想使用C语言中的文件操作方式,就可以将string 类中存储的字符串转化为C语言形式的字符串,从而进行操作,具体代码如下:
- void test_string()
- {
- string filename("test.cpp");
- FILE* fout = fopen(filename.c_str(), "r");
- assert(fout);
- char ch = fgetc(fout);
- while (ch != EOF)
- {
- cout << ch;
- ch = fgetc(fout);
- }
- }



使用场景:切割网页链接。
- void DealUrl(const string& url)
- {
- size_t pos1 = url.find("://");
- if (pos1 == string::npos)
- {
- cout << "非法url" << endl;
- return;
- }
- string protocol = url.substr(0, pos1);
- cout << protocol << endl;
-
- size_t pos2 = url.find('/', pos1 + 3);
- if (pos2 == string::npos)
- {
- cout << "非法url" << endl;
- return;
- }
- string domain = url.substr(pos1 + 3, pos2 - pos1 - 3);
- cout << domain << endl;
-
- string uri = url.substr(pos2 + 1);
- cout << uri << endl << endl;
- }
-
- void test_string11()
- {
- string filename("test.cpp.tar.zip");
- // 后缀
- //size_t pos = filename.find('.');
- size_t pos = filename.rfind('.');
- if (pos != string::npos)
- {
- //string suff = filename.substr(pos, filename.size() - pos);
- string suff = filename.substr(pos);
-
- cout << suff << endl;
- }
-
- string url1 = "https://cplusplus.com/reference/string/string/";
- string url2 = "https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=dme=0%26n%3D0";
- string url3 = "ftp://ftp.cs.umd.edu/pub/skipLists/skiplists.pdf";
-
- DealUrl(url1);
- DealUrl(url2);
- DealUrl(url3);
- }

find_first_of 的功能是搜索其参数中指定的任何字符匹配的位置,了解即可。

因为使用 cin 时,遇到空格则会停止输入,如果我们在以后的使用中,想把空格也输入到其中,则可以使用 getline 函数,使用 getline 只会在遇到 \n 时停止输入。

这些函数就不过多介绍了,原理很简单,就是从字符串转换到各种形式.
