string学习笔记

1.What’s string

$string$ 是一种$STL$的容器,支持多种字符串操作。

2.string的定义

使用$string$需要添加头文件

1
#include<string>

或者打好万能库,胜过zhw

同时必须要有

1
using namespace std;

定义$string$的方法非常简单,如下:

1
string name;//name为字符串名称

同时也可以定义$string$数组,如下:

1
string name[MAXN];//name为数组名,MAXN为数组大小

即这个数组中的每一个元素都是$string$类型

3.string初始化

可以直接在定义的时候初始化,如:

1
string name="I love C++!";

等价于:

1
2
string name;
name="I love C++!";

也可以写成:

1
string name("I love C++!");

4.string的访问

1.通过下标访问

1
2
string s="I love C++!";
printf("%c",s[0]);//输出I

2.通过迭代器访问

1.迭代器的定义

1
string::iterator node;//定义一个名为node的迭代器

2.访问

1
2
3
string s="I love C++";
string::iterator node=s.begin()//获取s的首地址
printf("%c",*node);//输出I(因为是迭代器所以前面要加上*)

5.string的基本运算

1.加法运算

加法运算可以将两个字符串拼接在一起,但加号两边必须至少有一个为$string$类型

如,下列程序是合法的:

1
2
3
4
string s1="I love ";
string s2="C++";
s1+=s2;//等价于s1=s1+s2
cout<<s1;//输出I love C++

但下列程序是不合法的:

1
2
string s1="I love "+"C++";
cout<<s1<<endl;

下列程序依然合法:

1
2
3
string s2="C";
string s1="I love "+s2+"++";
cout<<s1<<endl;//输出I love C++

2.关系运算

关系运算可以按字典序比较两个字符串的大小,如:

1
2
3
4
string s1="abcde";
string s2="bcdef";
if(s1<s2) cout<<"Winner!";//输出Winner!
else cout<<"Lose!";

6.string的输入与输出

1.利用cin和cout输入输出

$cin$在读到空格时将会停止读入,例如以下一段程序输入$123$ $456$后,仅会输出$123$

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

2.利用getline输入

$getline$可以用来读整行的字符串(包括空格),例如以下一段程序输入$123$ $456$后,输出$123$ $456$

1
2
3
string s;
getline(cin,s);
cout<<s;

3.将string转换为字符数组输入输出

$c$_$str()$可以将$string$转换为字符数组,如:

1
2
3
string s;
scanf("%s",s.c_str());
printf("%s",s.c_str());

输入$123$ $456$ 输出$123$

7.string的常用函数

1.length()和size()

1.作用

用来获取字符串的长度,即字符个数

2.时间复杂度

$O(1)$

3.用法

1
2
3
string s="abcd";
int len=s.size();
cout<<len;//输出4

2.begin()和end()

1.作用

分别用来获取字符串的首地址和尾地址,一般与迭代器配合使用

2.时间复杂度

$O(1)$?

3.用法

1
2
3
4
5
string s="I love C++!";
for(string::iterator it=s.begin()+2;it!=s.end();it++)
{
printf("%c",*it);//输出love C++!
}

3.clear()

1.作用

用来清空字符串中的所有元素

2.时间复杂度

$O(1)$

3.用法

1
2
3
string s="I love C++!";
s.clear();
cout<<s;//输出为空

4.substr()

1.作用

返回字符串的字串

2.时间复杂度

$O(n)$ ($n$为字符串长度)

3.用法

$s.substr(node,len)$返回从$node$位置开始,长度为$len$的字串

如:

1
2
string s="I love C++!";
cout<<s.substr(2,4);//输出love

5.insert()

1.作用

插入字符串

2.时间复杂度

$O(n)$ ($n$为字符串长度)

3.用法

$insert$有多种写法

1.$insert(node,s)$ 在$node$号位置插入字符串$s$

1
2
3
string s="I  C++!";
s.insert(2,"love");
cout<<s;//输出I love C++!

2.$insert(node,s,sum)$ 在$node$号位置插入字符串$s$的前$sum$个字符

1
2
3
string s="I  C++!";
s.insert(2,"love python",4);
cout<<s;//输出I love C++!

3.$insert(it,it2,it3)$ $it$为原字符串的欲插入位置,$it1$,$it2$为待插入字符串的首尾迭代器(左闭右开)

1
2
3
4
string s="I  C++!";
string ss="love python";
s.insert(s.begin()+2,ss.begin(),ss.begin()+4);
cout<<s;//输出I love C++!

4.$insert(node,sum,c)$ 在$node$号位置插入$sum$个字符$c$

1
2
3
string s="I love C!";
s.insert(8,2,'+');
cout<<s;//输出I love C++!

6.erase()

1.作用

$erase()$可以删除单个字符或一个区间内的字符

2.时间复杂度

$O(n)$ ($n$为字符串长度)

3.用法

1.$erase(it)$ $it$为欲删除元素的迭代器

1
2
3
string s="I love C+++!";
s.erase(s.begin()+10);
cout<<s;//输出I love C++!

2.$erase(left,right)$ $left$为区间的起始迭代器,$right$为区间末尾迭代器的下一个地址。左闭右开区间

1
2
3
string s="I love C++++!";
s.erase(s.begin()+10,s.begin()+12);
cout<<s;//输出I love C++!

3.$erase(node,len)$ 删除从$node$号位置开始$len$个字符

1
2
3
string s="I love C++++!";
s.erase(10,2);
cout<<s;//输出I love C++!

7.find()

1.作用

返回子串第一次出现的位置,如果找不到返回string::npos

2,时间复杂度

$O(nm)$ $n,m$分别为第一个,第二个字符串的长度

3,用法

1.$find(s)$,返回$s$在原字符串第一次出现的位置

1
2
3
4
5
6
7
8
9
string s="I love C++!";
if(s.find("C++")!=string::npos)
cout<<s.find("C++")<<" ";
else
cout<<"-1"<<" ";
if(s.find("python")!=string::npos)
cout<<s.find("python")<<" ";
else
cout<<"-1"<<" ";//输出7 -1

2.$find(s,node)$ 返回原字符串从$node$号位置开始$s$第一次出现的位置

1
2
3
4
5
6
7
8
9
string s="I love C++!";
if(s.find("C++")!=string::npos)
cout<<s.find("C++")<<endl;
else
cout<<"-1"<<endl;
if(s.find("C++",8)!=string::npos)
cout<<s.find("python")<<endl;
else
cout<<"-1"<<endl;//输出7 -1

8.replace()

1.作用

替换字符串

2.时间复杂度

$O(n)$ ($n$为要替换的字符串长度)

3.用法

1.$replace(node,len,s)$ 把原字符串从$node$号位置长度为$len$的子串替换为$s$

1
2
string s="I love python!";
cout<<s.replace(7,6,"C++");//输出I love C++!

2.$replace(it1,it2,s)$ 表示把原字符串的迭代器$it1$~$it2$范围内(左闭右开区间)的子串替换为$s$

1
2
string s="I love python!";
cout<<s.replace(s.begin()+7,s.begin()+13,"C++");//输出I love C++!

8.字符串数字互化

可以用$sscanf$和$sprintf$实现

1
2
3
4
string s="19260817";
int a;
sscanf(s.c_str(),"%d",&a);//把s以整数的形式输入到a(s要为字符数组)
cout<<a;//输出19260817
1
2
3
4
int a=19260817;
char s[30];
sprintf(s,"%d",a);
cout<<s;//输出19260817

同时我们也可以用一个神奇的东西——$stringstream$

友情提示:这个东西十分耗时!

1
2
3
4
5
6
stringstream ss;
string s="19260817";
int n;
ss<<s;//将s传入ss
ss>>n;//将ss传入n
cout<<n;//输出19260817

如果要多次调用$stringstream$,记住在每一次使用前都要$clear()$

9.推荐例题

思路点拨:运用$find$函数实现

思路点拨:按照题意模拟即可