目录
一、string 类的总结
大家可以去 cplusplus.com 中详细了解一下string类的文档介绍。
总结:
- string 是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作 string 的常规操作。
- string 在底层实际是: basic_string 模板类的别名
- 不能操作多字节或变长字符的序列.
二、 string 类的常用接口说明
1.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 关键字例子时对这有过讲解,本质是相同的。
2.string 类对象的容量操作
函数名称 | 功能说明 |
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 不会改变容量大小。
3.复制运算符重载
4.成员访问操作符
一个场景:遍历一遍字符串,并将其中一个字符+1
5.迭代器
目前在string中,它的使用类似于指针(不一定是指针)。
迭代器的使用
使用方式:
6. 三种尾插方式
这里举例三种常用的 string 插入方式,这里附上文档和使用举例,比较简单,就不多讲解了。
6.1 push_bank
使用举例:
6.2 append
6.3 +=运算符重载
使用方法:
7.insert 与 erase
以上的这些方式都是从字符串的末尾开始插入数据的,接下来我们学习在string任意位置删除字符的函数。
使用举例:
8. c_str
使用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);
}
}
9. find/rfind 与 substr
使用场景:切割网页链接。
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 的功能是搜索其参数中指定的任何字符匹配的位置,了解即可。
10. getline的输入
因为使用 cin 时,遇到空格则会停止输入,如果我们在以后的使用中,想把空格也输入到其中,则可以使用 getline 函数,使用 getline 只会在遇到 \n 时停止输入。
11.字符串的各种转化
这些函数就不过多介绍了,原理很简单,就是从字符串转换到各种形式.