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

文章目录

前言

继上篇有关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 专栏已经学习过双指针的各种用法啦

本题就是使用的对撞指针

话不多说,上代码

cpp 复制代码
class Solution 
{
public:
	bool isLetter(char ch)
	{
		if (ch >= 'a' && ch <= 'z')
			return true;
		if (ch >= 'A' && ch <= 'Z')
			return true;
		return false;
	}
	string reverseOnlyLetters(string S) 
	{
		if (S.empty())
			return S;
		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;
		}
		return S;
	}
};

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

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

本题就是简单的做一个映射关系 ,把字符当做下标来看 ,然后从小到大遍历一遍,找到第一个1就行

类似于数据结构排序里面讲的计数排序

话不多说,上代码

cpp 复制代码
class Solution 
{
public:
    int firstUniqChar(string s) 
    {
        int count[256] = {0};
        int size = s.size();
        for(int i = 0; i < size; i++)
        {
            count[s[i]]++;
        }
        for(int i = 0; i < size; i++)
        {
            if(count[s[i]] == 1)
            return i;
        }
        return -1;
    }
};

2.3 字符串最后一个单词

字符串最后一个单词

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

代码入下

cpp 复制代码
#include <iostream>
using namespace std;
int main() 
{
    string str;
    getline(cin,str);
    int pos = str.rfind(' ');
    cout<<str.size() - pos - 1<<endl; 
}

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

验证一个字符串是否回文

本题也是对撞指针,根据题意模拟一遍就好啦

然后就是处理一下大小写字符和空格

话不多说,上代码

cpp 复制代码
class Solution 
{
public:
    bool isPalindrome(string s) 
    {
        int size = s.size();
        int left = 0, right = size - 1;
        for(int i = 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--;
            }
            else
            return false;
        }
        return true;
    }
};

2.5 反转字符串

反转字符串

这题还是简单的,使用一个reverse 就好啦

注意:reverse 和 reserve是不一样的嗷
reverse 是 颠倒字符串 reserve 是给字符串预留空间

话不多说,上代码

cpp 复制代码
class Solution 
{
public:
    string reverseStr(string s, int k) 
    {
        int n = s.length();
        for (int i = 0; i < n; i += 2 * k) 
        {
            reverse(s.begin() + i, s.begin() + min(i + k, n));
        }
        return s;
    }
};

2.6 反转字符串中的单词

反转字符串中的单词

这题是上一题的进阶,但是也是相对来说比较简单的

就是在上一题的基础上,多处理一下就好啦

以空格为区分界限,然后用reverse进行翻转

这里就用到了迭代器,begin 和 end

cpp 复制代码
class Solution 
{
public:
    string reverseWords(string s) 
    {
        int pos = 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;
            }
            int x = pos;
            pos = s.find(' ',pos+1);
            reverse(s.begin()+x+1,s.begin()+pos);
            
        }
        return s;
    }
};

2.6 字符串相加

字符串相加

这题也是有关string的

但是相比前面的题目就难处理好多,这里涉及到了字符串相加

字符串相加之前要先处理成正常的数字 ,然后再进行相加

字符串太长也不能直接转化为整型 ,所以要从后往前一个一个字符往前加

加到最前面就是最终答案,处理起来还是比较麻烦的,但是整体思路还是比较简单

话不多说,上代码

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

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

总结

今天把string类剩下的一些常用接口做了解

然后练习一些有关string的习题,加深巩固用法

下一篇博客我们就来继续加深string的学习吧
从了解,到学会,再到实现,不要走开,小编持续更新中~~~~~

相关推荐
网络安全指导员5 分钟前
cenos7网络安全检查
开发语言·安全·web安全·php
傻啦嘿哟15 分钟前
Python 实现多语言朗读与单词选择测验程序
开发语言·python·pygame
青春_strive40 分钟前
Qt:文件
开发语言·qt
wen__xvn41 分钟前
每日一题蓝桥杯P8598 [蓝桥杯 2013 省 AB] 错误票据c++
开发语言·数据结构·c++·算法
JuicyActiveGilbert1 小时前
【C++设计模式】第一篇:单例模式(Singleton)
c++·单例模式·设计模式
fleetstar1 小时前
如何使用go本地编译caddy插件
开发语言·后端·golang
IT北辰1 小时前
源码:用Python进行电影数据分析实战指南
开发语言·python
重生之成了二本看我逆天改命走向巅峰2 小时前
从0搭建Tomcat第二天:深入理解Servlet容器与反射机制
java·开发语言·笔记·学习·servlet·tomcat·idea
rkmhr_sef2 小时前
Java进阶:Dubbo
java·开发语言·dubbo
数维学长9862 小时前
【2025rust笔记】超详细,小白,rust基本语法
开发语言·笔记·rust