# 字符串string

#include <string>

顾名思义,就是存储字符串的

# 1. 常用方法

# 构造

构造函数:string(长度, 初值)

string s1;           //构造空字符串
string s2 = "abc";   //构造字符串,并赋值abc
string s3(10, '6');  //构造字符串,通过构造函数构造为6666666666
1
2
3

# 输入输出

C++

string s;
cin >> s;
cout << s;
1
2
3

C

string s;
char buf[100];
scanf("%s", &buf);
s = buf;
printf("%s", s.c_str());
1
2
3
4
5

# 其他

作用 用法 示例
修改、查询指定下标字符 [] s[1] = 'a';
是否相同 == if(s1 == s2) ...
字符串连接 + string s = s1 + s2;
尾接字符串 += s += "awa";
取子串 .substr(起始下标, 子串长度) string sub = s.substr(2, 10);
查找子串 .find(待查串) s.find("abc");
转换为整型 stoi() int x = stoi(s);
转换为长整型 stoli() long int x = stoli(s);
转换为double stod() double x = stoll(s);
将其他类型转换为字符串 to_string() string s = to_string(x);

ps:取子串时不写子串长度则默认到串尾;.find()若找到了,则返回待查串中第一个字符的下标,若不存在则返回string::nposstring::npos是一个数;一系列类型转换函数需要加头文件#include <sto>

# 2. 适用情形

非常好用!

# 3. 注意事项

# 尾接字符串一定要用+=

string+=运算符,将会在原字符串原地尾接字符串。而 + 了再 = 赋值,会先生成一个临时变量,再复制给 string. 通常字符串长度可以很长,如果使用 + 字符串很容易就 TLE 了。

//优化前:15139ms
string s;
for(int i = 0; i < 5e5; i++)
    s = s + "a";

//优化后:< 1ms(计时器不显示)
string s;
for(int i = 0; i < 5e5; i++)
    s += "a";
1
2
3
4
5
6
7
8
9

# .substr()方法的奇葩参数

一定要注意,C++ string的取子串的第一个参数是子串起点下标,第二个参数是子串长度。

第二个参数不是子串终点!不是子串终点!要与java 等其他语言区分开来。

# .find()方法的复杂度

该方法实现为暴力实现,时间复杂度为O(n2)O(n^2)

不要幻想STL内置了个O(n)O(n)的 KMP算法

上次更新时间:: 2/16/2025, 12:39:00 AM