C++标准库类型之string类

 

目录

 

文章目录

前言

一、最常用的string操作

1.定义和初始化string对象

2.string在对象上的操作

🔥读写string对象

 🔥使用getline读取一行

🔥string的empty和size操作

 🔥比较string对象

 🔥两个string对象相加

  🔥字面值和string对象相加

 🔥范围for

3.string类对象容器操作

🔥reserve

🔥capacity

🔥resize

 🔥clear

4.string类对象的修改操作 

🔥push_back

🔥append

 🔥operator+=

 🔥c_str

🔥find

 🔥rfind

 🔥substr

总结

 


前言

标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中。接下来的示例都是已经包含了头文件的。

包含头文件:

#include<iostream>
#include<string>
using namespace std;//这里也可以写成using std::string;只单独展开string类,但是我们为了输入输出方便简洁,就全部展开了。
int main()
{
	string s1;
	return 0;
}

 


 

一、最常用的string操作

1.定义和初始化string对象

如何初始化类的对象是由类本身决定的。一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所差别:或者是初始值的数量不同,或者是初始值的类型不同。

下边是几个例子:

代码如下(示例):

int main()
{
	string s1;//默认初始化,s1是一个空字符串
	string s2 = s1;//s2是s1的副本
	string s3 = "hello";//s3是该字符串字面值的副本
	string s4(10, 'c');//s4的内容是cccccccccc
	return 0;
}

🔥可以通过默认的方式初始化一个strin对象,这样就会得到一个空的string,就是该string中没有任何字符。

🔥如果提供了一串字符串,就像s3那样,那么该字符串字面值除了最后的空字符(也就是'\0')外其他所有的字符都被拷贝(调用了拷贝构造,深拷贝)到新创建的string对象中去。

🔥如果提供的是一个数字和一个字符,则string对象的内容就是给定字符连续重复若干次得到的序列。

string s1默认初始化,s1是一个空串
string s2(s1)s2是s1的副本,本质上是拷贝构造
string s2=s1等价于s2(s1),s2是s1的副本
string s3("hello")s3是字面值"hello"的副本,不过没有'\0'

string s3="hello"

等价于s3("hello"),s3是字面值"hello"的副本
string s4(n,'c')把s4初始化为由连续n个字符c组成的串

还有一种初始化方式,不过用起来不是很舒服。就是string s5=string(10,'c'),它实际上使用数字10和字符c这两个参数创建出来了一个string对象,然后这个对象又拷贝给了s5。本质上就是string temp(10,'c'),string s5=temp。可读性较差,不建议使用。 

2.string在对象上的操作

一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。其中,类既能定义通过函数名调用的操作,也能定义<<,+等各种运算符在该类对象上的新含义(也就是运算符重载)。

string的操作
os<<s将s写到输出流os当中,返回os
is>>s从is中读取字符串赋给s,字符串已空白分隔,返回is
getline(is,s)从is中读取一行赋给s,返回is
s.empty()s为空返回true,否则返回false
s.size()返回s中字符的个数
s[n]返回s中第n个字符的引用,n从0开始,可以抽象为下标
s1+s2返回s1和s2连接后的结果
s1=s2用s2的副本代替原来s1中原来的字符
s1==s2如果s1和s2中包含的字符完全一样,则它们相等
s1!s2string对象的相等性判断对字母的大小写敏感
<,>=,>,>=

利用字符在字典中的顺序进行比较,对大小写敏感

🔥读写string对象

使用标准库中的iostream来读写内置类型的值,同时,也可以来读写string对象。

6d58119839344758b835e74d05e86845.png

在执行读取操作时,string对象会自动忽略开头的空白(即空白符,换行符,制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白位置。 如上所述,如果输入的是“     hello   world  ”我们会发现开头和结尾的空格没有输出出来,输出的是"hello",也就是没有输出任何空格。如果想把空格也输出出来,就需要用到另一个函数getline实现,下边会讲。 

 string类对象也可以连续输入,连续输出。

9db711c79b59467b87e505d44e2dca5d.png

 🔥使用getline读取一行

如果我们想在最终得到的字符串中保留空格,就需要用到getline函数,函数从给定的输入流中读入内容,直到遇到换行符停止(换行符其实也被读进来了),然后把所读内容存入到string对象中去(不过不存换行符)。getline只要一遇到换行符就会停止读取操作并返回结果,如果一开始就是换行符,那么string就会是一个空的对象。

a5bf6948c66443e59a16fb81db44063e.png

🔥string的empty和size操作

empty 就是根据string对象是否为空返回一个布尔值,他是string的一个成员函数,只要使用点操作符就可以执行这个函数。!为逻辑非运算符,返回与其运算对象相反的结果。

382aa078f92f4e3790639bb112e76a55.png

size 函数返回string对象的长度(也叫string对象中字符的个数)。

81e62110128940899a2d7f59b80fc9a7.jpeg

注意:size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接
口保持一致,一般情况下基本都是用size()。

 

 🔥比较string对象

string对象重载了几种用于比较字符串的运算符。这些比较运算符逐一比较string对象中的字符,并且对大小写敏感,也就是说,在比较同一个字母大写形式和小写形式是不同的。比较字母的时候是按照ASCALL码值比较的。也就是小写大于大写。ASCALL码值中65-90是‘A’-‘Z’。97-122是'a'-'z'。

如果两个string对象的长度不同,而且较短string对象的每个字符都与较长string对象对应位置上的字符相同,那么较短对象小于较长对象。

7c4da2a4a3024f06bf9cf44b0774d5ba.png

如果两个string对象在某些位置上不一致,则string对象比较的结果其实是string对象中第一对相异字符比较的结果。 

9bbe90f6927a498b900d0a7ea8b187d1.png

根据以上规则可以得出:

a26fc96b6a01423b8170f7e50b7888c2.png

这三个string对象中,s3最大,s1最小。

 🔥两个string对象相加

两个string对象相加得到一个新的string对象,其内容是把+运算符左侧和右侧运算对象串接而成。例如:

9d14f0d545024e27862735f3f7d0a5b5.png

  🔥字面值和string对象相加

因为标准库允许把字符字面值和字符串字面值转换成string对象,所以在需要string对象的地方就可以使用这两种字面值来替代。当吧string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string。比如:

int main()
{
	string s1 = "hello", s2 = "world";
	string s3 = s1 + "," + s2 + '\n';
	string s4 = s1 + ",";//正确
	string s5 = "hello" + ",";//错误:两个运算对象都不是string
    string s6=s1+","+"world";//正确,本质上是string s6=(s1+",")+"world"
	return 0;
}

 🔥范围for

范围for语句,这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作

42ed6b034a444126a2a4eee051fdd733.png

想要访问string中指定位置的字符还有另一种方式,就是把字符串看成一个字符数组,通过下标的方式索引。比如:

767fde2994b049dcb88a2f3d6df67cc0.png

这也是string对象的魅力之处,方便又好用,哈哈。 

3.string类对象容器操作

reserve为字符串预留空间,相当于提前开空间(但不同于直接开空间)
capacity返回空间总大小
resize将有效的字符改成n个,分三种情况
clear清空有效字符,但是没有改变容量

🔥reserve

reverse是string类对象常用的容器操作,为字符串预留空间,但不又不同于直接开空间,如果我们先reverse(100),再reverse(50),我们利用capacity会发现空间还是100。不过reverse预留空间通常会比我们给的值多一些。reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。(不过参数小于总大小不改变容量大小是在vs环境下,linux会改变,官方文件里边也说了不确定,看情况,所以一般需要看编译器来判断会不会缩小)

9bedf51467aa4a859f034fb32e0e8ca3.png66ef9dcef06b4169937793caf255774b.png

🔥capacity

capacity是返回string容器的有效空间,如reserve图中所示。

🔥resize

resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不
同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char
c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数
增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
980fb9ffdac745b29a2cae4d5fe28dc8.png

 🔥clear

clear是清空有效字符,但是不改变容量。

c5019b7d56ec432a8e50edf4bfc2532b.png

4.string类对象的修改操作 

push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
c_str返回C格式字符串
find从字符串pos位置开始往后找字符,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回
注意:
1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差
不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可
以连接字符串。
2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留
好。

 

🔥push_back

在字符串后尾插字符c。

db76d72ce6b44c609087a4853d704024.png

🔥append

在字符串后追加一个字符串。

6ccae04626d14ea5bbe0159b61b0b959.png

 🔥operator+=

在字符串后追加字符串str。

3ca088603ab04a788770fe48bdfe4355.png

 🔥c_str

返回C格式字符串。c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址。因为在c语言中没有string类型,必须通过string类对象的成员函数 c_str() 把 string 转换成c中的字符串样式

0443f1b054724db4a91b79517d8ea683.png

🔥find

从字符串pos位置开始往后找字符,返回该字符在字符串中的位置。

2ce29f129e874800854b2bf7b68a0dc5.png

 🔥rfind

与find相反,find是从pos位置往后找,rfind是从pos位置往前找。

6fafccf5ba4e4036a727ac6f3e8b9a17.png

 🔥substr

在str中从pos位置开始,截取n个字符,然后将其返回。

e8d5e15dd13c4435b728c987172944e3.png


总结

以上就是今天的内容,本文仅仅简单介绍了C++中string类的常见接口和使用,而string提供了大量能使我们快速便捷地处理数据的函数和方法。希望亲们三连支持一下哈!!!!!

ca65c95838929fa062ea131b0fd808e3.gif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值