三、string
1.string的自我介绍
在C语言中,一般使用字符数组 char str[]来存放字符串,很麻烦!在C++中加入了string类型,可以理解为元素为char型的vector,string对字符串的需求功能进行了封装,使得操作简单,不容易犯错。
使用string需要添加的头文件是#include<string>(桥黑板!!string.h(同cstring)和string是不一样的头文件)。当然还要加上using namespace std;这一句的。
2.string的定义
定义的方式和基本数据类型相同,在string后面加上变量名即可:
string str;
如果要初始化,可以直接给string类型的变量进行赋值:
string str="abcd";
3.string容器内元素的访问形式
注:之前说过C++容器中有一对好基友,没错! 就是string和vector,只有他俩可以使用直接对迭代器进行加减某个数字,如str.begin()+3
<li>通过下标访问
即可以像访问char型数组一样去访问string,比如:
#include<stdio.h>
#include<string>
string str="hahah";
printf("%c",str[2]);//输出 h
但是要读入和输出整个字符串,则只能用cin和cout:
[php]#include#include
using namespace std;
int main(){
string str;
cin>>str;
cout<<str;//相当于,printf("%s\n",str.c_str());即将string类型用c_str()变为字符数组
return 0;//并不推荐第二种写法!了解即可
}[/php]
<li>通过迭代器访问
因为string不像其他STL容器一样需要参数,因此迭代器的定义很简单:
string::iterator it;
这样就得到了迭代器,并且可以通过*it来访问string中的每一位元素:
for(string::iterator it=str,begin();it!=str.end();it++){
printf("%c",*it);
}
4.string中的基本操作
(真的只是基本操作,也是常用的,文末推荐几个博客,有更多骚操作!!!里面写的很详细,感兴趣的朋友可以深入研究,string真的很强大,之前说过, STL各个都是武林高手,身怀绝技的啊!)
(1)operator+=
这是string的加法,可以将两个string直接拼起来!,比如:
string str1="i",str2="love you!",str3;
str3=str1+str2;//cout得到str3: i love you!(single dog 一万点伤害(捂脸))
str1+=str2;//将str2直接拼接到str1上,得到str1:同上(捂脸)(捂脸)
(2)compare operator
简单说一下,即两个string类型可以直接使用==,!=,<=等比较大小,比较规则为字典序,从两个string的首位开始比较,遇到不一样的即按字典序比较返回结果。但比如 ,str1="aa",str2="aaa",则是str1<str2,不多介绍,用的时候试一下就自然清楚啦。
(3)lenth()/size()
可以认为两个基本相同,时间复杂度都是O(1),返回string的长度,即存放的字符数。比如,str=“aa",返回2。
(4)insert()
string的insert()函数写法很多,实际上不只insert,赋值,连接,比较查找等函数都很多,自然,功能也很细节化,很完善,不常用,这里只介绍算法需要用到的,就上上文所说的,文末会推荐一个非常好的博客,如果又需要,可以去仔细研究。
<li><em>insert(pos,string),</em>在pos号位置插入字符串string。</li>
string str="abc",str2="xyz";
str.insert(1,str2);//结果str:axyzbc
<li><em>intsert(it,it2,it3)</em>,it为原字符串欲插入的位置,it2和it3为待插入字符串的首位迭代器,用来表示串[it2,it3)将被插在it的位置上,比如:
string str="abcxyz",str2="opq";
str.insert(str.begin()+3,str2.begin(),str2.end());//桥黑板!!再次强调,只有vector和string这两个好基友迭代器加数字的形式!!结果,str:abcopqxyz
(5)erase()
删除单个元素: str.erase(it),it为需要删除的元素的迭代器。
删除一个区间内的所有元素:
str.erase(first,last),first未删除区间的起始迭代器,last为需要删除区间的末尾迭代器的下一个指针,也即[first,last)。
str.erase(pos,length),其中pos为需要删除的其实位置,length为删除的字符个数。
(6)clear()
clear()用来清空string中的数据,时间复杂度O(1)。
substr()
substr(pos,len)返回从pos号位开始,长度为len的子串,时间复杂度O(len)。(注:本文只有it才是迭代器,pos是下标)
(7)string::npos
string::npos是一个常数,其本身的值为-1,但由于是 unsigned_int类型,因此呢,实际上也可以认为是unsigned_int类型的最大值。 string::npos用以作为find函数(如上文所述,find即查找函数非常多,详见下文推荐博客!)失配时的返回值。 可以认为string::npos等于-1或者4294967295。
(8)find()
<li>str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,那么返回上文提到的string::npos(也就是-1和那个无符号整型的最大值啦)。</li>
<li>str.find(str2,pos),从str的pos号位开始匹配str2,返回值同上。时间复杂度为O(nm),n,m为str,str2的长度。</li>
(9)replace()
<li><em>str.replace(pos,len,str2)</em>把str从pos号位开始,长度为len的子串替换为str2。</li>
<li><em>str.replace(it1,it2,str2)</em>把str的迭代器[it1,it2)范围的子串换为str2。</li>
<li>时间复杂度<em>O(str.length())</em>。</li>
5.string的优良特性
C++ 标准库中的string类型 支持可变长度的字符串,提供了很多有用的操作 标准库将负责管理与存储字符相关的内存。
平均来说 使用string类型的程序执行速度比C风格字符串快很多 而且不容易出错 ;以前的很多地方C语言程序是用C语言风格字符串写的 没有用标准库类型string 可能不具备有移植性 两者都要掌握 现代C++程序员应更多地使用string。
6.string的用途
处理“串”的问题。。。
来道题练练手:
PAT A1060. Are They Equal (25)
注:题意不难,编码较为复杂,但也是练string的好题目!加油吧
注:此题解法很巧妙,简洁,推荐66姐的博客1001. A+B Format (20)-PAT甲级真题
推荐博客:标准C++中的string类的用法总结
。