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

简介: 用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类的用法总结

 

 

 





 
    




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

目录
相关文章
|
20天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
20天前
|
存储 编译器 C语言
C++_String增删查改模拟实现
C++_String增删查改模拟实现
46 0
存储 编译器 Linux
5 0
|
10天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
45 1
|
10天前
|
C语言 C++
【C++初阶】9. string类的模拟实现
【C++初阶】9. string类的模拟实现
36 1
|
24天前
|
存储 C++
C++:String的模拟实现
C++:String的模拟实现
|
24天前
|
存储 缓存 编译器
C++:String类的使用
C++:String类的使用
|
27天前
|
存储 算法 JavaScript
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(二)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
27 0
|
27天前
|
算法 搜索推荐 程序员
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(一)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
33 0
|
27天前
|
C++
C++ std::string类的使用
C++ std::string类的使用
19 0