目录
前言
1.String类的增删查改
1.1增
实验代码:
运行结果:
实验代码:
运行结果:编辑
1.2删
实验代码:
结果:
1.3查找
练习:查找文件后缀
运行结果:
1.4 改
前言
上篇博客中,我介绍了String类的基本成员函数,这些函数主要与其成员变量属性有关,接下来看一看它的增删查改接口函数。
1.String类的增删查改
1.1增
增就是添加数据到对象中,在String类中共有四种增加数据的方式:
push_back();
append();
+=运算符;
inesrt();
1.对于push_back()来说,只能逐个字符逐个字符的添加;
2.对于append()函数来说,它可以有多种方式的添加:
如上,append常用的就是上面红框框住的两种,一个是字符串,一个是字符对象;
3.对于+=重载运算符函数来说,它可以用于字符串的添加,也可以用于对象的添加;
4.对于insert函数来说,也是如此:
实验代码:
string s1 = "Hello";
//1.push_back接口,也是用于在尾部添加内容,不过一次只能添加一个字符!!!
s1.push_back('c');
s1.push_back('h');
s1.push_back('y');
s1.push_back('q');
//s1.push_back("safsaf"); //报错!
cout << s1 << endl;
//2.append接口,可以在字符串尾部添加内容
s1.append(" ");
cout << s1 << endl;
s1.append("!");
cout << s1 << endl;
s1.append("World!");
cout << s1 << endl;
//3.+=接口——运算符重载 ,作用:拼接功能,可以多个字符串对象之间的拼接,也可以拼接内容
string s2 = "Tomorrow Hello!";
string s3 = "WangYuan ";
s3 += s2;
cout << s3 << endl;
s3 += "See You again";
cout << s3 << endl;
运行结果:
实验代码:
//insert函数功能
string s1 = "Hello World!";
string s2 = "xixi ";
//用法1:在下标处插入字符串
cout << s1.insert(0, "bit ")<<endl;
cout << s1.insert(9, "bit ")<<endl;
//用法2:在下标处插入字符对象
cout << s1.insert(0, s2)<<endl;
//用法3:在下标处插入字符串的前n个字符内容
cout << s1.insert(18, "WangJunKai",11)<<endl;
cout << "----------------------------------------------------------" << endl;
运行结果:
通过这四种添加数据的方式,我们可知:
1.+=的使用是最方便好用的,也是最快捷的。
2.push_back和append方式都是尾插数据,这对于底层是连续存储空间的数组来说,效率较高。
3.而insert函数可以在任意位置插入数据,任意位置则表明需要挪动数组的数据,因为数组挪动数据的时间复杂度为O(N),所以insert的使用效率是最低的,最不常用的。
1.2删
删意味着是删除数据,它有两种函数可以删:
1.clear();——可以清理删除类对象的所有内容,使得该对象的数据为零
2.erase();——可以删除类对象任意位置的数据
由于现在还没有深入学习iterator迭代器,所以我们常用的只有第一种,参数中pos位置不主动传参的话,默认是从下标0处删除数据,len表示要删除的长度,参数不主动传参的话,默认是删npos个。
npos是一个静态成员变量,它的类型是size_t(底层是无符号整型),初值设为-1,而无符号整型的-1往往表示的正数的最大值42亿多,所以len=npos 表示长度会直到字符串结束。
回到erase()中,len设置为npos,则表示默认删到字符串结束——从pos位置开始删除,一直删到字符串末尾!
实验代码:
//erase函数功能,该接口的参数全部是缺省参数,不给值就是全删,直到斜杆0为止
string s1 = "Hello World!";
string s2 = "xixi";
string s3(s1);
//常用用法1:在下标处删除n个字符内容,若要删的字符数超过字符串大小,则到'\0'自动停下
cout << s1.erase(0, 3) << endl;
cout << s2.erase(2, 2) << endl;
cout << s3.erase() << endl; //全部删除
结果:
1.3查找
查找,就要用到find()了:
共有4种find方式,常用的有三种。 该函数的返回值返回类对象内容的下标位置处。
练习:查找文件后缀
//练习:查找后缀
string s4;
cin >> s4; //输入test.cpp,就可以获取.cpp后缀
size_t pos2 = s4.find('.');
if (pos2 != string::npos) {
string s5 = s4.substr(pos2);
cout << s5;
}
通过输入带有点后缀的文件名称,通过pos2去寻找输入文件中的字符'.',找到后返回该字符下标位置处,通过使用substr()函数拷贝字符'.'后面的所有内容到新对象中。
find()函数就是搭配各种函数进行底层的遍历查找,进而做想要做的事情。
find()是正着寻找,而rfind()——是用于倒着找想要寻找的字符或字符串内容。
假设还是查找文件的后缀,如上我最后一次输入的是qqq.out.zip.war一长串文件名,我只想要拿到最后一个点及后面的内容,靠使用find()函数会很麻烦,而rfind()很快就能解决:
string s6;
cin >> s6; //输入test.cpp,就可以获取.cpp后缀
size_t pos3 = s6.rfind('.');
if (pos3 != string::npos) {
string s7 = s6.substr(pos3);
cout << s7 << endl;
}
运行结果:
其实还有几个关于查找的扩展函数:
有兴趣的话可以自行了解~
1.4 改
改的话,在第一篇讲String的时候就已经说了——String的遍历方式,我们想要修改类对象的数据,可以通过for循环+[ ]方括号遍历、也可以通过迭代器遍历修改。这里就不过多的讲解了,大家可以到下面这个文章中查看。
C++之STL——String字符序列类(1)_那string是怎么实现一个对象里有多个有序字符的呢_橙予清的zzz~的博客-CSDN博客