算法学习之路|用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类的用法总结

 

 

 





 
    




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

目录
相关文章
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
73 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
81 2
动态规划算法学习三:0-1背包问题
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明