算法学习之路|用C++刷算法会用到的STL(三)——string

三、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的好题目!加油吧

PAT A1001. A+B Format (20)

注:此题解法很巧妙,简洁,推荐66姐的博客1001. A+B Format (20)-PAT甲级真题

参考:《算法笔记》(胡凡,曽磊)

推荐博客:标准C++中的string类的用法总结

 

 

 





 
    




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/459356

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。