STL string 字符串

sdxjzsq

2018-10-20 22:25:49

Personal

### 前言 最近几天对于字符串的处理变得多了起来,原来我是拒绝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...