引言
从本文开始,我们将对 C++ 容器进行系统讲解,首先,从相对简单的string说起。
1.基础知识
- 1.1 概念
string本质是一个字符顺序表
- 1.2 包含头文件
<string>
2.构造
- 2.1 无参构造(默认)
不提供任何数据,由编译器执行的默认构造,只包含了“/0”这个字符,如下:
string s1;
- 2.2 参数构造
提供字符串变量,或者直接提供字符串都可以进行构造,如下:
string s2("mzk likes ena");
cout << s2 << endl;
- 2.3 拷贝构造
直接拷贝另一个string变量,用括号和=都可以实现
tring s2("mzk likes ena");
string s3(s2);
string s4 = s2;
cout << s3 << endl;
cout << s4 << endl;
- 2.4 选择拷贝构造
可以选择拷贝对象中的一部分进行拷贝,第一个参数表示的是从哪个下标开始,第二个参数表示的是往后几个字符,如下:
string s2("mzk likes ena");
string s5(s2, 0, 3);
cout << s5 << endl;
运行结果如下:

如果不写第三个参数,那么就会从指定的下标开始直接拷贝完,如下:
string s2("mzk likes ena");
string s5(s2, 4);
cout << s5 << endl;
运行结果如下:

- 2.5 用连续的n个字符去初始化
没什么好解释的,直接给例子
string s6(10, 'm');
cout << s6 << endl;
3.基本用法
- 3.1 string::operator[]
本质就是像数组一样通过下标去修改数据,如果越界就会报错
string s1("mzk");
cout << s1 << endl;
s1[2] = 's';
cout << s1 << endl;
运行结果如下:

- 3.2 reserve
意义是提前开空间,避免了扩容,提高了效率,如果开的空间本就小于现在的空间,则无影响
string s1("mzk");
cout << s1 << endl;
s1.reserve(100);
cout << s1 << endl;
s1.reserve(1);
cout << s1 << endl;
运行结果如下:

- 3.3 clear
清除string对象内的所有字符,但不清除容量
string s1("mzk");
cout << s1 << endl;
s1.clear();
cout << s1 << endl;
运行结果如下:

- 3.4 reserve(逆置)
就如名称所示,将范围内的字符串逆置,范围由迭代器组成,用法如下:
string s1("mzk");
cout << s1 << endl;
reverse(s1.begin(), s1.end());
cout << s1 << endl;
运行结果如下:

要注意这里只能用迭代器表示范围,迭代器的内容可以观看这篇文章:迭代器基本知识 – 小园得志
- 3.5 尾插字符串
1. append插入
尾插的字符串可以是string类型,也可以是char类型,具体使用方法如下:
string s2("mzk");
s2.append("ena");
cout << s2 << endl;
string s3("99");
s2.append(s3, 0, 2);
cout << s2 << endl;
同样的,如果尾插的是string对象,也可以像拷贝构造一样,规定尾插的起始点,第一个参数为下标,第二个参数为长度,此代码运行结果如下:

2.string::operator+
相对于上一个用法,我更推荐这个,因为直接加一个字符串或者string对象就可以了,更加的方便
string s2("mzk");
s2 = s2 + "ena";
cout << s2 << endl;
string s3("99");
s2 = s2 + s3;
cout << s2 << endl;
运行结果如下:

- 3.6 erase(删除字符)
可以删除string对象内的一串字符,可以规定位置和长度,有两种用法,第一种是下标+长度,第二种是用迭代器表示范围
//利用下标+长度删除
string s2("enamzk99");
cout << s2 << endl;
s2.erase(s2.begin(), s2.begin() + 3);
cout << s2 << endl;
//利用迭代器删除
string s3("enamzk99");
cout << s3 << endl;
s3.erase(0, 3);
cout << s3 << endl;
要注意的是,第一种用法如果不加长度,就会将下标后的所有字符删除完,运行结果如下:

- 3.7 replace(替换)
可以将字符串中的一部分字符串替换为其他字符串,具体用法为第一个参数填从哪个下标开始替换,第二个参数填长度,第三个参数填要替换的字符串
string s4("mzk ena love");
cout << s4 << endl;
s4.replace(4, 3, "knd mfy");
cout << s4 << endl;
要注意的是,删掉字符串后就从对应下标开始替换,如果替换字符串长度超过删除字符串长度,会自动向后扩容,并且不会覆盖后面的字符,运行结果如下:

- 3.8 find(查找字符串)
用来查找字符串中的字符/字符串,返回第一个出现此字符/字符串的下标,没找到则返回-1,第一个参数为要查找的字符/字符串,第二个参数为开始查找位置的下标
string s4("mzk ena love");
cout << s4 << endl;
int i = s4.find('z', 0);
cout << i << endl;
运行结果如下:

相反的是,我们还可以用rfind反向查找,用法与find相同,这里不过多介绍
- 3.9 find_first_of(查找字符串)
与上述find不同的是,如果是字符串,只要能匹配上字符串中的一个字符就可以,然后返回这个字符的下标
string s4("mzk ena love");
cout << s4 << endl;
int j = s4.find_first_of("mzk", 0);
cout << j << endl;
运行结果如下:

同样的,find_last_of是反向查找的形式
4.通过输入来构造string对象
当我们正常使用cin来对string对象进行输入时,如果遇到空格就会跳过,为了解决这个问题,我们可以使用getline来解决问题,具体用法如下:
string s5;
getline(cin, s5);
cout << s5 << endl;
第一行为输入内容,运行结果如下:

还要强调的是,如果你想将终止符换为换行的其他字符,可以加入第三个参数作为终止符
string s5;
getline(cin, s5, 'e');
cout << s5 << endl;
这里则是遇到’e’这个字符就终止,当我输入“mzkena”时,运行结果如下:

结尾
当你看到这里时,你就已经将string的基本用法全部看完了,接下来就是在平常的代码中进行练习使用了

评论(0)
暂无评论