一、上期回顾
彻底吃透引用与指针 底层差异、const 修饰规则、传参三种方式。从今天开始正式进入 C++ STL 标准模板库 深耕,先从最常用的 string 入手。
二、为什么要用 string 替代 C 语言 char []
C 语言字符数组短板:
- 长度固定,容易溢出
- 拼接、查找、截取需要手写逻辑
- 无法直接赋值、比较
- 函数传参容易退化指针、越界崩溃
C++ string 优势:
- 动态扩容,不用关心内存大小
- 自带赋值、拼接、查找、截取、替换全套接口
- 支持直接
+拼接、==比较 - 面向对象封装,安全不易越界
三、string 常见构造方式
#include <iostream>
#include <string>
using namespace std;
int main()
{
// 1. 空字符串
string s1;
// 2. 用字符串常量构造
string s2("hello");
// 3. 简化写法
string s3 = "world";
// 4. 拷贝构造
string s4(s2);
// 5. n个相同字符
string s5(5, 'a');
cout << s2 << endl;
cout << s3 << endl;
cout << s5 << endl;
return 0;
}
四、string 赋值与拼接
1. 直接赋值
string s;
s = "C++ STL";
s = 'A';
2. 拼接两种方式
string a = "hello";
string b = " world";
// 方式1:+ 拼接
string c = a + b;
// 方式2:append
a.append(b);
a.append(3, '!');
五、string 常用遍历方式
string s = "abcde";
// 1. 下标遍历
for(int i = 0; i < s.size(); i++)
{
cout << s[i] << " ";
}
// 2. 迭代器遍历
for(string::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
// 3. 范围for(C++11)
for(char ch : s)
{
cout << ch << " ";
}
六、核心常用接口(必背)
string s = "helloSTL";
// 1. 获取长度
s.size();
s.length();
// 2. 判断是否为空
s.empty();
// 3. 清空字符串
s.clear();
// 4. 截取子串
// pos起始位置, len长度
string sub = s.substr(0,5);
// 5. 查找字符/字符串
// 找到返回下标,没找到返回 string::npos
int pos = s.find("STL");
// 6. 替换
s.replace(0,5,"Hi");
// 7. 插入
s.insert(0,"###");
// 8. 删除
s.erase(0,3);
七、string 与 C 字符数组互转
// string 转 char*
string s = "hello";
const char* str = s.c_str();
// char* 转 string
char arr[] = "C language";
string s2 = arr;
八、字符串比较
直接用运算符,不用 strcmp
string a = "abc";
string b = "abd";
if(a == b) cout << "相等";
if(a < b) cout << "a更小";
九、完整综合示例代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1 = "Hello";
string s2 = " C++STL";
// 拼接
string s3 = s1 + s2;
cout << "拼接:" << s3 << endl;
// 长度
cout << "长度:" << s3.size() << endl;
// 查找
int pos = s3.find("STL");
if(pos != string::npos)
cout << "STL 位置:" << pos << endl;
// 截取
string sub = s3.substr(0,5);
cout << "子串:" << sub << endl;
return 0;
}
十、今日核心总结
string替代 C 语言字符数组,动态内存、安全便捷- 支持直接赋值、
+拼接、关系运算符比较 - 三大遍历:下标、迭代器、范围 for
- 必会接口:
size/empty/clear/substr/find/replace/insert/erase c_str()实现和 C 语言字符串互转
十一、课后练习
- 输入一个字符串,遍历打印每个字符
- 查找字符串中指定字符的位置
- 截取前 3 个字符生成新串