c++领域展开第十四幕——STL(String类的常用接口说明以及相关练习)超详细!!!!
人民网>>社会·法治

c++领域展开第十四幕——STL(String类的常用接口说明以及相关练习)超详细!!!!

2025-06-24 12:09:43 | 来源:人民网
小字号

在这里插入图片描述

文章目录

  • 前言
  • 一、string类的常用接口
    • 1.1 string类对象的访问及遍历操作
    • 1.2 string类对象的修改操作
    • 1.3string类非成员函数
  • 二、牛刀小试
    • 2.1反转字母
    • 2.2找字符串中第一个只出现一次的字符
    • 2.3 字符串最后一个单词
    • 2.4验证一个字符串是否回文
    • 2.5 反转字符串
    • 2.6 反转字符串中的单词
    • 2.6 字符串相加
  • 总结

前言

继上篇有关string类的文章,已经一个多月没有更新后续啦
上篇我们把string类的有关容量的接口了解完毕
今天我们来继续学习 string 类的一些常用接口,然后再使用一下这些好用的东西去算法习题中大战身手
跟着我的节奏,fellow me

一、string类的常用接口

1.1 string类对象的访问及遍历操作

operator[]----------------返回pos位置的字符,const string类对象调用
begin+ end--------------begin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rend-----------rbegin获取最后一个字符的迭代器 + rend获取第一个字符下一个位置的迭代器
注意:

  1. 第一个相当于数组的 [ ],后面我们模拟实现string类的时候,会重载 [ ] 并进行使用,就是访问指定位置用的

  2. 后面的begin和end就是迭代器的内容,在使用swap等函数时,会用到begin和end

1.2 string类对象的修改操作

push_back -----------在字符串后尾插字符c
append----------------在字符串后追加一个字符串
operator+=-----------在字符串后追加字符串str
c_str-------------------返回C格式字符串
find + npos-----------从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind--------------------从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr ----------------在str中从pos位置开始,截取n个字符,然后将其返回

注意:

  1. 在string尾部追加字符时,s.push_back© / s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好

1.3string类非成员函数

operator+ --------------------尽量少用,因为传值返回,导致深拷贝效率低
operator>> ------------------输入运算符重载
operator<<-------------------输出运算符重载
getline-------------------------获取一行字符串
relational operators---------大小比较

上面的接口了解一下就OK啦,实在想弄明白,点击就行,已经生成文档链接
我们后续模拟实现string类的时候也会讲到

二、牛刀小试

下面来一些习题,都是有关字符串的操作的,这样能更好的熟练string类的一些接口的使用

2.1反转字母

反转字母
在这里插入图片描述
code ability专栏已经学习过双指针的各种用法啦
本题就是使用的对撞指针
话不多说,上代码

classSolution{ public:boolisLetter(charch){ if(ch >='a'&&ch <='z')returntrue;if(ch >='A'&&ch <='Z')returntrue;returnfalse;}string reverseOnlyLetters(string S){ if(S.empty())returnS;size_t begin =0,end =S.size()-1;while(begin <end){ while(begin <end &&!isLetter(S[begin]))++begin;while(begin <end &&!isLetter(S[end]))--end;swap(S[begin],S[end]);++begin;--end;}returnS;}};

2.2找字符串中第一个只出现一次的字符

找字符串中第一个只出现一次的字符

在这里插入图片描述
本题就是简单的做一个映射关系,把字符当做下标来看,然后从小到大遍历一遍,找到第一个1就行
类似于数据结构排序里面讲的计数排序
话不多说,上代码

classSolution{ public:intfirstUniqChar(string s){ intcount[256]={ 0};intsize =s.size();for(inti =0;i <size;i++){ count[s[i]]++;}for(inti =0;i <size;i++){ if(count[s[i]]==1)returni;}return-1;}};

2.3 字符串最后一个单词

字符串最后一个单词
在这里插入图片描述

这题说的是最后一个单词的长度,最直接的方法就是使用 rfind 这个接口,从后面开始遍历直到遇到空格
另外就是输入字符串时要注意空格也要输入,所以要使用 getline

代码入下

#includeusingnamespacestd;intmain(){ string str;getline(cin,str);intpos =str.rfind(' ');cout<<str.size()-pos -1<<endl;}

2.4验证一个字符串是否回文

验证一个字符串是否回文
在这里插入图片描述
本题也是对撞指针,根据题意模拟一遍就好啦
然后就是处理一下大小写字符和空格
话不多说,上代码

classSolution{ public:boolisPalindrome(string s){ intsize =s.size();intleft =0,right =size -1;for(inti =0;i <size;i++){ if(s[i]>='A'&&s[i]<='Z'){ s[i]+=32;}}while(left <right){ while(left <right &&!((s[left]<='z'&&s[left]>='a')||(s[left]<='9'&&s[left]>='0'))){ left++;}while(left <right &&!((s[right]<='z'&&s[right]>='a')||(s[right]<='9'&&s[right]>='0'))){ right--;}if(s[left]==s[right]){ left++;right--;}elsereturnfalse;}returntrue;}};

2.5 反转字符串

反转字符串
在这里插入图片描述
这题还是简单的,使用一个reverse就好啦
注意:reverse 和 reserve是不一样的嗷
reverse 是 颠倒字符串 reserve 是给字符串预留空间

话不多说,上代码

classSolution{ public:string reverseStr(string s,intk){ intn =s.length();for(inti =0;i <n;i +=2*k){ reverse(s.begin()+i,s.begin()+min(i +k,n));}returns;}};

2.6 反转字符串中的单词

反转字符串中的单词
在这里插入图片描述
这题是上一题的进阶,但是也是相对来说比较简单的
就是在上一题的基础上,多处理一下就好啦
以空格为区分界限,然后用reverse进行翻转
这里就用到了迭代器,begin 和 end

classSolution{ public:string reverseWords(string s){ intpos =0;pos =s.find(" ",0);reverse(s.begin(),s.begin()+pos);while(1){ if(pos ==s.rfind(' ')){ reverse(s.begin()+pos+1,s.end());break;}intx =pos;pos =s.find(' ',pos+1);reverse(s.begin()+x+1,s.begin()+pos);}returns;}};

2.6 字符串相加

字符串相加
在这里插入图片描述
这题也是有关string的
但是相比前面的题目就难处理好多,这里涉及到了字符串相加
字符串相加之前要先处理成正常的数字,然后再进行相加
字符串太长也不能直接转化为整型,所以要从后往前一个一个字符往前加
加到最前面就是最终答案,处理起来还是比较麻烦的,但是整体思路还是比较简单

话不多说,上代码

classSolution{ public:string addStrings(string num1,string num2){ intend1 =num1.size()-1;intend2 =num2.size()-1;intvalue1 =0,value2 =0,next =0;string ans;while(end1 >=0||end2 >=0){ if(end1 >=0){ value1 =num1[end1--]-'0';}elsevalue1 =0;if(end2 >=0){ value2 =num2[end2--]-'0';}elsevalue2 =0;intvalue =value1 +value2 +next;//  每一位都用 两个value进行接收然后相加  进位就用 next == 1if(value >9)//	下一位相加是加上next{ next =1;value -=10;}elsenext =0;ans+=(value +'0');//  这里用户ans接收,相加后的数字字符,但是与正常答案是相反的}if(next ==1){ ans +='1';}reverse(ans.begin(),ans.end());//  最后用到reverse进行反转操作  得到最终答案returnans;}};

今天的有关string的习题就到这里啦

总结

今天把string类剩下的一些常用接口做了解
然后练习一些有关string的习题,加深巩固用法
下一篇博客我们就来继续加深string的学习吧
从了解,到学会,再到实现,不要走开,小编持续更新中~~~~~

在这里插入图片描述

(责编:人民网)

分享让更多人看到