前言
最近几天对于字符串的处理变得多了起来,原来我是拒绝STL的,感觉string这种东西好麻烦,不如char字符数组来的简单,后来做了P1039 侦探推理这题以后发现string实在是太好用了,而今天又A了P1098 字符串的展开,再加上今天的模拟赛,对stl的string越用越舒服,因此决定写篇文章总结下备忘。
各种方法
-
输入
- cin
珂以使用cin.tie(0);
来加快输入速度。
也珂以使用ios::sync_with_stdio(false)
来加快速度,但是这样就不能使用scanf输入和printf输出,会炸...... - getline
string s; getline(cin,s);
Tips:
getline(sin,s,'#')
珂以读入一行,但是只保留#
前面的部分到s中。 - 转为传统字符串
可以使用s.c_str()
函数转为传统字符串后使用scanf("%s",s.c_str());
输入,但是注意必须提前resize
好大小,不然会爆炸!
- cin
-
获取长度
int len=s.length();
或int len=s.size();
-
截取substr
s.substr(pos, n);//截取s中从pos开始(包括0)的n个字符的子串,并返回 s.substr(pos); //截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回
-
替换replace
s.replace(pos, n, s1);//用s1替换s中从pos开始(包括0)的n个字符的子串
-
翻转reverse
reverse(s.begin(),s.end()); // 翻转字符串
-
查找find
find(char ch/string s)
查找字符ch或者字符串s的第一次出现的起始位置,查找不到返回string::npos
也就是-1find(string s,int pos,int n)
从pos+1开始查找字符串s的前n个字符,返回起始位置,若不存在,则返回-1。其中n珂以省略。
例如:#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
-
插入insert
insert(int pos,string s)
在pos位置的后面插入字符串s。 比如#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个字符。 比如#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
比如#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珂以省略。
例如:#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珂以省略。
例如:#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进行赋值才能进行插入操作,玄学...
-
删除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结束的字符。
例如:#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
-
resize
string s; s.resize(100); // 相当于 new char[100];
万岁!终于写完了orz...