【C++】STL中 string 的常用接口

目录

一、string 类的总结

二、 string 类的常用接口说明

1.string 类对象的常见构造

2.string 类对象的容量操作

3.复制运算符重载

4.成员访问操作符

5.迭代器

6. 三种尾插方式

6.1 push_bank

6.2 append

6.3 +=运算符重载

7.insert 与 erase

8. c_str

9. find/rfind 与 substr

10. getline的输入

11.字符串的各种转化

一、string 类的总结

大家可以去 cplusplus.com 中详细了解一下string类的文档介绍。

总结:

  1. string 是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作 string 的常规操作。
  3. string 在底层实际是: basic_string 模板类的别名
  4. 不能操作多字节或变长字符的序列.

二、 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填充

注意:

  1. size() 和 length() 方法底层实现原理完全相同,引入 size 的原因是为了与其他容器的接口保持一直,一般情况基本都使用size()
  2. clear() 只是将string种有效字符清空,不改变底层空间大小
  3. resize(size_t n) 与 resize (size_t n,char c)都是将字符串有效字符个数改变到 n 个,不同的是当字符个数增多时:resize (n)用 0 来填充多出的元素空间,resize (size_t n,char c)用字符 c 来填充多出的元素空间。注意:resize 在改变元素个数时,如果是将元素个数增多,可能会改变容量的大小,如果是将元素个数减少,底层空间总大小不变。
  4. 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.字符串的各种转化

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值