C++新经典课程学习笔记之第二章-2.7小节
本博客将记录:string类型这个知识点的笔记!
这方面知识分为4个点:
一、前言
二、string类型简介
三、定义和初始化string对象
四、string对象上的常见操作和知识
一、前言:
在Cpp中,因为有C++标准库,它给我们封装好了许多好用的数据类型,比如string,vector等等。这些标准库都是人家经过多年的开发经验沉淀下来的优秀的代码,一般人是不太可能写出比这些标准库更优秀的代码的。因此我们在日常的coding中必须要尽量地使用这些标准库中的东西。
二、string类型简介:
我们都知道在C语言中字符串是这样定义的:
char str[10] = "lzf";
在C++中有更好的字符串类型,即string类类型。
string类型是C++标准库提供的类型,是一种可变长的字符串类类型。
注意:使用前,要包含头文件<string>,也即写上:#include<string>
比如:
- #include<iostream>
- #include<string>
- using namespace std;
-
- int main(void){
- string str = "lzf";
- return 0;
- }
三、定义和初始化string对象:
- string s;//创建了一个string类的对象s,默认初始化s1 = ""空串,表示里面啥都没有
- string s2 = "I Love China!";//把I Love China!这个字符串内容拷贝到了s2代表的一段内存中去
- //注意:拷贝时是不包括' '这个字符串的结束标识字符的!
- string s3("I Love China!");//跟s2的写法效果是一致的!
- string s4 = s2;//把s2中的内容拷贝到了s4所代表的一段内存中去
-
- int nums = 6;
- string s5(nums, 'a');//"aaaaaa"
- //把s5初始化为连续的nums个字符'a'所组成的字符串
- //这种创建字符串的方式不太推荐,因为这样会在系统的内部创建 临时的对象存储这nums个字符所组成的字符串
- //然后再将这个临时的对象拷贝给s5所代表的一段内存中去,再将这个临时对象销毁。
- //这样do的效率very低!
四、string对象上的常见操作和知识:
(string类中,内置了许多有用的对于string对象的操作,或者说内置了许多string类的成员函数,可以对string类的对象do一些事情!)
今天回顾一下这个string类内置的一些常用的函数:
a)判断是否为空串.empty(),返回的是布尔值(bool 类型的值,true or false)
- string s;
- if(s.empty()) cout<<"s为空串!"<<endl;
运行结果:
b).size() / .length(),返回的是该string类型的字符串的长度
(也即字节/字节数量,类型为unsigned int)
- string s1;
- cout << s1.size() << endl;//0
- cout << s1.length() << endl;//0
- string s2 = "我爱中国";
- cout << s2.size() << endl;//8
- cout << s2.length() << endl;//8
- string s3 = "I Love China!";
- cout << s3.size() << endl;//13
- cout << s3.length() << endl;//13
- //从这里也可以看出来string类型的字符串长度是不包括' '的!
c)string[n]:返回的是string类型对象中的n号index的字符,当然,n的范围是[0,s.size()-1];
(本质上这是string这个类中重载了取数组中的元素的符号[ ]),因此使用这个符号可以对string类的对象,也即对这种字符串进行访问和修改的功能,也即读和写的功能!)
- string s = "I Love China!";
- // |||||||||| \
- // s 0123456789 10 11 12
- if (s.size() > 4) {
- cout << s[4] << endl;//'v'
- s[4] = 'W';
- //把这个字符串中index为4的位置的字符修改为'W'
- }
- cout << s << endl;//"I LoWe China!"
d)s1+s2:表示字符串的连接
(string类中重载了operator+号,返回s1和s2这2个字符串连接后的结果所形成的一个新的string对象)
- string s1 = "LZF";
- string s2 = "YZSA";
- string s3 = s1 + s2;
- cout << s3 << endl;//"LZFYZSA"
e)s1 = s2;字符串对象的赋值操作,用s2里边的内容取代原来s1的内容
- string s1 = "LZF";
- string s2 = "TJR";
- s1 = s2;//用字符串对象s2中的内容取代掉s1中的内容
- cout << s1 << endl;//"TJR"
f)s1 == s2:判断2个字符串对象是否相等。or s1 != s2:判断2个字符串对象是否不相等。
我们首先得知道什么是大小写敏感:也即大写字母和小写字符被认为是2个不同的字符,比如
abc != ABC,abc!= AbC ....
(本质上,是string类中重载了operator==号以及operator!=不等号)
(所谓相等:长度相同 且 串中的字符全都相同)
(所谓不相等:不满足以上任一条条件就不相等了)
- string s1 = "abc";
- string s2 = "ABc";
- if (s1 == s2) {
- cout << "s1 == s2" << endl;
- }
- else if (s1 != s2) {
- cout << "s1 != s2" << endl;
- }
- //结果:s1 != s2
g)s.c_str():返回一个指向字符串对象s中的字符串all内容的常量指针
也即返回一个正规的c语言的字符串,这个字符串是以' '结尾的。
这个c_str()成员函数的引入是为了让c++的字符串与c语言的兼容,在c中是没有string类的,so我们通过将string类的对象(也即c++的字符串)的c_str()成员函数就可以把string对象转换为c语言中的字符串样式了!
- string s1 = "ABc";
- const char* ps = s1.c_str();
- cout << "const char* ps = " << ps << endl;
- //结果:const char* ps = ABc;
注意:如果说你要使用c语言中的字符串来给c++的字符串赋值的话,直接这样do即可:
(记住,这其实也是一种初始化string的方式,用的是c语言形式的字符数组(字符串)来初始化string)
- char str[20] = "I Love China!";
- string s(str);
- cout<<"s = " << s <<endl;//s = I Love China!
h)读写string对象时,cin的话会自动给你剔除空格,且如果你输入了有效字符后再输入空格就相当于于在这个你输入的第一个空格处停止写入字符的意思。
- string s;
- cin>>s;
- cout<<"s = "<< s <<endl;
-
- //当你写入 abc e时
- //输出 s = abc
i)字面值与string类对象do加法:
- string s1 = "lzf";
- string s2 = "wll";
- string s3 = s1 + " love " + s2 + " forever" + '!';
- cout << "s3 = " << s3 << endl;//结果: lzf love wll forever!
-
-
- //中间夹杂着string对象,因此可以让不是string的自动转换为string!
- //也即这个加法的过程中" love "、" forever"、'!'都会(隐式)自动类型转换为string类型
- //因为s3 = 右边的夹杂着的s1和s2是string类型,因此会do上述工作
- //然后再do加法,并最后赋值给s3!
注意这2种特殊case:
- string ss = "lzf" + "wll";//×!
- //cpp的语法上不能这么干!因为编译器不知道这2个字符串到底要转换为啥类型。
- //(这个在py的语法中是允许的)
-
- string ss = "lzf" + "wll" + s3;//×!因为+号是左结合性的,所以会默认让"lzf" + "wll"相加
- //此时又会出现上述所说的编译器不知道给你先转成啥类型的字符串,因此不要这样do!
j)范围for语句对于string类型的使用:c++11中提供了范围for:能够遍历一个序列中的每一个元素
(对于string类型而言,一个string类型的对象就可以看作是一个序列了)
- string s = "I Love Wll!";
- for(auto ch:s){
- cout<<ch<<" ";// result: "I L o v e W l l ! "
- }
- //用范围for对string类型的对象do修改的操作时,就必须用auto&引用的类型来do!
- //因为引用就给这个变量or对象取别名的意思,那么这样就会使得ch分别会成为s中的每一个字符的别名
- //那么ch所指向的地址空间和每个s的字符的空间就会一致,那么这样就可以顺利成章的修改s中的每一个字符了!
-
- //toupper()函数:把小写的字母都变成大写,大写的字母不变。
- for(auto ch:s){
- ch = toupper(ch);
- }
- cout<<s<<endl;// result: "I LOVE WLL!"
好,那么以上就是这一2.7小节我所回顾的内容的学习笔记,希望你能读懂并且消化完,也希望自己能牢记这些小小的细节知识点,加油吧,我们都在coding的路上~