STL string 字符串
sdxjzsq
2018-10-20 22:25:49
### 前言
最近几天对于字符串的处理变得多了起来,原来我是拒绝STL的,感觉string这种东西好麻烦,不如char字符数组来的简单,后来做了[P1039 侦探推理](https://www.luogu.org/problemnew/show/P1039)这题以后发现string实在是太好用了,而今天又A了[P1098 字符串的展开](https://www.luogu.org/problemnew/show/P1098),再加上今天的模拟赛,对stl的string越用越舒服,因此决定写篇文章总结下备忘。
### 各种方法
1. 输入
- cin
珂以使用`cin.tie(0);`来加快输入速度。
也珂以使用`ios::sync_with_stdio(false)`来加快速度,但是这样就不能使用scanf输入和printf输出,会炸......
- getline
``` cpp
string s;
getline(cin,s);
```
Tips:`getline(sin,s,'#')`珂以读入一行,但是只保留`#`前面的部分到s中。
- 转为传统字符串
可以使用 `s.c_str()` 函数转为传统字符串后使用`scanf("%s",s.c_str());`输入,但是注意必须提前 `resize` 好大小,不然会爆炸!
2. 获取长度
`int len=s.length();`或`int len=s.size();`
3. 截取substr
```cpp
s.substr(pos, n);//截取s中从pos开始(包括0)的n个字符的子串,并返回
s.substr(pos); //截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回
```
4. 替换replace
``` cpp
s.replace(pos, n, s1);//用s1替换s中从pos开始(包括0)的n个字符的子串
```
5. 翻转reverse
```cpp
reverse(s.begin(),s.end()); // 翻转字符串
```
3. 查找find
- `find(char ch/string s)`
查找字符ch或者字符串s的第一次出现的起始位置,查找不到返回 `string::npos` 也就是-1
- `find(string s,int pos,int n)`
从pos+1开始查找字符串s的前n个字符,返回起始位置,若不存在,则返回-1。其中n珂以省略。
例如:
``` cpp
#include<bits/stdc++.h>
using std::cout;
using std::endl;
int main()
{
std::string s="abcabc";
int pos=s.find('c');
cout<<pos<<endl;
pos=s.find("bc");
cout<<pos<<endl;
pos=s.find("bcf",pos+1,2);
cout<<pos<<endl;
pos=s.find("bcf",pos+1);
cout<<pos<<endl;
}
```
输出为:
```
2
1
4
-1
```
3. 插入insert
- `insert(int pos,string s)`
在pos位置的后面插入字符串s。
比如
```cpp
#include<bits/stdc++.h>
using std::cout;
using std::endl;
int main()
{
std::string s="abc",v="dd";
s.insert(2,v);
cout<<s<<endl;
}
```
的输出结果是`abccd`
- `insert(int pos,string s,int pos2,int n)`
在pos位置的后面插入字符串s中从pos2开始的n个字符。
比如
```cpp
#include<bits/stdc++.h>
using std::cout;
using std::endl;
int main()
{
std::string s="abc",v="def";
s.insert(2,v,0,2);
cout<<s<<endl;
}
```
的输出结果是`abdec`
- `insert(int pos,int n,char c)`
在pos位置的后面插入n个字符c
比如
``` cpp
#include<bits/stdc++.h>
using std::cout;
using std::endl;
int main()
{
std::string s="abc";
char c='d';
s.insert(2,2,c);
cout<<s<<endl;
}
```
的运行结果也是`abddc`。
- `insert(int pos,char* s,int n)`
在pos位置插入字符数组s中的前n个字符。
其中n珂以省略。
例如:
``` cpp
#include<bits/stdc++.h>
using std::cout;
using std::endl;
int main()
{
std::string s="abc",v="def";
char ss[]="ghi";
s.insert(2,ss,2);
cout<<s<<endl;
char sss[]="jkl";
s.insert(5,sss);
cout<<s<<endl;
}
```
的输出结果就是:
```
abghc
abghcjkl
```
- `insert(std::string::iterator iter,int n,char ch)`
在迭代器处插入n个字符ch(将原来在迭代器处的字符向后挤),其中n珂以省略。
例如:
```cpp
#include<bits/stdc++.h>
using std::cout;
using std::endl;
int main()
{
std::string s="abc";
std::string::iterator iter = s.begin();
cout<<*iter<<endl;
s.insert(iter,2,'f');
cout<<s<<endl;
iter = s.begin();
cout<<*iter<<endl;
s.insert(iter,'g');
cout<<s<<endl;
}
```
输出结果:
```
a
ffabc
a
f
gffabc
```
珂以看出貌似迭代器还是会指向a,此时如果不对迭代器进行重新复制的话就会卡死,不知道什么原因...需要重新对iter进行赋值才能进行插入操作,玄学...
5. 删除erase
- `erase(int pos)`
删除pos位置以及pos位置之后的所有字符。
- `erase(int pos,int n)`
删除从pos开始的n个字符。
- `erase(std::string::iterator iter)`
删除iter迭代器处的元素。
- `erase(std::string::iterator iter,std::string::iterator iter2)`
删除从iter开始到iter2结束的字符。
例如:
```cpp
#include<bits/stdc++.h>
using std::cout;
using std::endl;
int main()
{
std::string s="abcabc";
s.erase(2,1);
cout<<s<<endl;
s.erase(1,2);
cout<<s<<endl;
s="abcdef";
std::string::iterator iter = s.begin(),iter2=s.end()-2;
s.erase(iter);
cout<<s<<endl;
iter=s.begin()+1;
s.erase(iter,iter2);
cout<<s<<endl;
}
```
的输出结果为:
```
ababc
abc
bcdef
bf
```
6. resize
```
string s;
s.resize(100); // 相当于 new char[100];
```
### 万岁!终于写完了orz...