1.What’s string
$string$ 是一种$STL$的容器,支持多种字符串操作。
2.string的定义
使用$string$需要添加头文件
1 |
或者打好万能库,胜过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 | string name; |
也可以写成:
1 | string name("I love C++!"); |
4.string的访问
1.通过下标访问
1 | string s="I love C++!"; |
2.通过迭代器访问
1.迭代器的定义
1 | string::iterator node;//定义一个名为node的迭代器 |
2.访问
1 | string s="I love C++"; |
5.string的基本运算
1.加法运算
加法运算可以将两个字符串拼接在一起,但加号两边必须至少有一个为$string$类型
如,下列程序是合法的:
1 | string s1="I love "; |
但下列程序是不合法的:
1 | string s1="I love "+"C++"; |
下列程序依然合法:
1 | string s2="C"; |
2.关系运算
关系运算可以按字典序比较两个字符串的大小,如:
1 | string s1="abcde"; |
6.string的输入与输出
1.利用cin和cout输入输出
$cin$在读到空格时将会停止读入,例如以下一段程序输入$123$ $456$后,仅会输出$123$
1 | string s; |
2.利用getline输入
$getline$可以用来读整行的字符串(包括空格),例如以下一段程序输入$123$ $456$后,输出$123$ $456$
1 | string s; |
3.将string转换为字符数组输入输出
$c$_$str()$可以将$string$转换为字符数组,如:
1 | string s; |
输入$123$ $456$ 输出$123$
7.string的常用函数
1.length()和size()
1.作用
用来获取字符串的长度,即字符个数
2.时间复杂度
$O(1)$
3.用法
1 | string s="abcd"; |
2.begin()和end()
1.作用
分别用来获取字符串的首地址和尾地址,一般与迭代器配合使用
2.时间复杂度
$O(1)$?
3.用法
1 | string s="I love C++!"; |
3.clear()
1.作用
用来清空字符串中的所有元素
2.时间复杂度
$O(1)$
3.用法
1 | string s="I love C++!"; |
4.substr()
1.作用
返回字符串的字串
2.时间复杂度
$O(n)$ ($n$为字符串长度)
3.用法
$s.substr(node,len)$返回从$node$位置开始,长度为$len$的字串
如:
1 | string s="I love C++!"; |
5.insert()
1.作用
插入字符串
2.时间复杂度
$O(n)$ ($n$为字符串长度)
3.用法
$insert$有多种写法
1.$insert(node,s)$ 在$node$号位置插入字符串$s$
1 | string s="I C++!"; |
2.$insert(node,s,sum)$ 在$node$号位置插入字符串$s$的前$sum$个字符
1 | string s="I C++!"; |
3.$insert(it,it2,it3)$ $it$为原字符串的欲插入位置,$it1$,$it2$为待插入字符串的首尾迭代器(左闭右开)
1 | string s="I C++!"; |
4.$insert(node,sum,c)$ 在$node$号位置插入$sum$个字符$c$
1 | string s="I love C!"; |
6.erase()
1.作用
$erase()$可以删除单个字符或一个区间内的字符
2.时间复杂度
$O(n)$ ($n$为字符串长度)
3.用法
1.$erase(it)$ $it$为欲删除元素的迭代器
1 | string s="I love C+++!"; |
2.$erase(left,right)$ $left$为区间的起始迭代器,$right$为区间末尾迭代器的下一个地址。左闭右开区间
1 | string s="I love C++++!"; |
3.$erase(node,len)$ 删除从$node$号位置开始$len$个字符
1 | string s="I love C++++!"; |
7.find()
1.作用
返回子串第一次出现的位置,如果找不到返回string::npos
2,时间复杂度
$O(nm)$ $n,m$分别为第一个,第二个字符串的长度
3,用法
1.$find(s)$,返回$s$在原字符串第一次出现的位置
1 | string s="I love C++!"; |
2.$find(s,node)$ 返回原字符串从$node$号位置开始$s$第一次出现的位置
1 | string s="I love C++!"; |
8.replace()
1.作用
替换字符串
2.时间复杂度
$O(n)$ ($n$为要替换的字符串长度)
3.用法
1.$replace(node,len,s)$ 把原字符串从$node$号位置长度为$len$的子串替换为$s$
1 | string s="I love python!"; |
2.$replace(it1,it2,s)$ 表示把原字符串的迭代器$it1$~$it2$范围内(左闭右开区间)的子串替换为$s$
1 | string s="I love python!"; |
8.字符串数字互化
可以用$sscanf$和$sprintf$实现
1 | string s="19260817"; |
1 | int a=19260817; |
同时我们也可以用一个神奇的东西——$stringstream$
友情提示:这个东西十分耗时!
1 | stringstream ss; |
如果要多次调用$stringstream$,记住在每一次使用前都要$clear()$
9.推荐例题
1
猪国杀
思路点拨:运用$find$函数实现
思路点拨:按照题意模拟即可