learn C++ NO.10——string(3)

news2024/12/25 10:05:57

引言:

现在是北京时间2023年6月22日的早上8点。又是一年端午,时光如梭。这一年来发生的变化太多了,遥想去年此时,我还沉浸在被大学录取的喜悦中,转眼间大一就过去了。这里我也衷心的祝愿您和您的家人端午安康!
在这里插入图片描述

关于元素访问的成员函数

上回介绍了下标访问操作符的运算符重载,这里我就不再介绍。第一个接口我们介绍的是at()接口。at和下标访问操作符的运算符重载使用起来是没什么区别的。但是,在对于越界操作的处理方式两者有些不同。at()对于越界访问是抛出异常。而下标访问操作符是直接assert暴力处理。
在这里插入图片描述

#include <iostream>
#include <string>

using namespace std;

int main()
{
    try {
        string s1("hello world");
        s1.at(0) = 'x';
        cout << s1 << endl;
        //s1[15];  // 暴力处理
        s1.at(15); // 温和的错误处理
    }
    catch (const exception& e)
    {
        cout << e.what() << endl;
    }

    return 0;
}

在这里插入图片描述
front()接口和back()接口就是访问第一个和访问最后一个元素。这里也就不过多介绍了。需要注意的是这两个接口是c++11标准所支持的,在centOS7下的g++编译器下需要指定相关标准,简单演示一下。

g++ test.cpp -std=c++11

在这里插入图片描述

关于修改的成员函数

首先介绍的是insert()接口,insert()用于将字符/字符串/string类对象的内容插入到pos位置中。(1)在pos位置后插入一个string类对象。(2)在pos位置后,插入一个长度为sublen的string类对象的子串。(3)在pos位置后插入一个c字符串。(4)在pos位置后插入一个c字符串的前n个字符。(5)在pos位置后插入n个字符。(6)支持使用迭代器插入字符。(7)支持插入一个string类迭代器的区间。

在这里插入图片描述

在这里插入图片描述
接着介绍一下erase()接口,erase()接口用于删除string类对象的内容。(1)删除从pos位置开始len个字符(默认删除整个串)。当然可以利用缺省参数删除pos位置后的所有内容。(2)删除迭代器指向的字符。(3)删除迭代器区间的内容。
在这里插入图片描述

在这里插入图片描述
最后介绍一下replace()接口,replace()接口用新内容替换字符串中从字符pos开始并跨越len字符的部分。(1)从pos位置长度为len的部分替换成str类对象。(2)将pos位置长度为len的部分替换成str类对象的子串。(3)从pos位置长度为len的部分替换成c字符串。(4)从pos位置长度为len的部分替换c字符串的前n个字符。(5)从pos位置长度为len的部分替换c字符串的n个字符。(6)将迭代器i1-i2区间内的部分替换成first-last的内容。
在这里插入图片描述
在这里插入图片描述
小结:在学习了前面的顺序表部分内容后,是可以理解string类对象这些修改接口在底层大概是怎么实现的。由此也可以更加理解使用string类修改接口的一些效率上的差距。对于顺序表,从头部或pos位置删除或者插入都是比较麻烦的,因为要涉及遍历数据,删除/插入数据,以及挪动数据。效率上是非常差的。频繁的调用这些接口并不是很好的选择,当然这里也仅仅是介绍这些接口的使用方式。

字符串操作类函数

首先介绍c_str()接口,返回一个指针指向string类对象的首字符的地址。用于用于一些特殊场景,如调用c的库,就可以用c_str()将string类对象转化成c字符串。
在这里插入图片描述
在这里插入图片描述
下面介绍一下find()接口,find接口可以在字符串中搜索由其参数指定的内容第一次出现的下标位置。当指定pos时,搜索只包括位置pos或位置pos之后的字符,忽略任何可能出现的包含位置pos之前字符的字符。注意,与find_first_of()接口不同,每当搜索多个字符时,仅匹配其中一个字符是不够的,整个序列必须匹配。
在这里插入图片描述
下面介绍一下substr()接口,这个接口会返回一个用从pos位置长度为len的字串构造的string类。
在这里插入图片描述
下面就以截取一个URL的协议、域名、资源的问题进行演示。

在这里插入图片描述
介绍一下热find()接口,和find()功能类似,不同的是从string类的尾部往前遍历。可以用于查问指定后缀文件等场景。
在这里插入图片描述
在这里插入图片描述
find_first_of()接口在字符串中搜索与参数中指定的任何字符匹配的第一个字符。可以用循环遍历整个string类对象,用find_first_of()指定要访问的的内容的下标。在这里插入图片描述在这里插入图片描述
针对字符串操作类函数就暂且介绍这么多吧,百看不如一试,下来之后可以尝试用一用。下面进入oj部分的讲解。

string类OJ

字符串相加

在这里插入图片描述
本题解题思路如下,取字符串的末尾的数据并减去字符’0’后的整型值相加。若和大于10,就将和/10进1位。然后再讲和取余数尾插到string中。知道遍历完两个字符串后将整体逆置后返回。

在这里插入图片描述

//参考代码
class Solution {
public:
    string addStrings(string num1, string num2) 
    {
        string strRet;
        int end1 = num1.size()-1;
        int end2 = num2.size()-1;
        //用来标记进位
        int carry = 0;
        //从后向前遍历字符串,两个都结束才结束
        while(end1 >= 0 || end2 >= 0)
        {
            //根据与字符'0'的差相加
            int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2] - '0' : 0;

            int ret = val1+val2+carry;
            //判断进位,并取余数尾插
            carry = ret / 10;
            ret %= 10;
            
            //插入数据
            strRet += '0'+ret;
            
            //迭代
            end1--;
            end2--;
        }      
        //判断是否还有没进的位
        if(carry == 1)
        {
            strRet += '1';
        }
        //整体逆置
        reverse(strRet.begin(),strRet.end());

        return strRet;

    }
};

字符串转化成整数

在这里插入图片描述
解题思路如下,首先倒着遍历字符串。一旦遇到非数字字符就直接return 0,若是数字字符就将其插入string类对象中。在第0位置处特殊判断一下若是’-'就将其表示为-1指存入整型变量中。然后逆置字符串。然后用除模取余的方式将string类对象的每一个字符都转化成对应为的整型值。最后将整型值*上特殊标记的整型变量返回。
在这里插入图片描述

class Solution {
public:
    int StrToInt(string str) {
        string strRet;
        int val = 0;
        //用于标记正负
        int flag = 1;
        int end = (str.size())-1;

        //遍历string类对象
        while(end >= 0)
        {
            if(str[end] >= '0' && str[end] <= '9')
            {
                val = str[end] - '0';
            }
            else if(end == 0 && (str[end] == '-' || str[end] == '+'  ))
            { 
                if(str[end] == '-')
                    flag = -1;

                break;
            }
            else
            {
                return 0;
            }

            strRet += '0'+val;
            end--;
        }
        //逆置
        reverse(strRet.begin(),strRet.end());
        int sz = strRet.size();
        int ret = 0;
        int n = 0;
        while(sz)
        {
            //把对应位的值*位的权值后,加起来求和
            int tmp = (strRet[sz-1] - '0') * pow(10,n++);
            ret += tmp;
            sz--;
        }
        return ret*flag;
    }
};

字符串最后一个单词的长度

在这里插入图片描述
本题主要主要就是应用rfind()和getline()接口。由于是io型的OJ所以要用getline()输入数据,rfind()倒着遍历string类对象。反向查询最后一个空格所在位置,从而确定最后一个单词。循环遍历string类对象,用’ '出现的位置减去size+1即为最后一个单词长度。本题难点为cin不能接收空格或换行符就会停止读取,并将内容放到缓冲区。所以只能用getline()进行读取数据。getline()为非成员函数。
在这里插入图片描述

#include <iostream>
using namespace std;

int main() 
{
    string s1;
    //cin不能读取空格和换行,不能用
    getline(cin,s1);
    size_t wpos = s1.rfind(' ');
    if(wpos != string::npos)
    {
        //左闭右开-1就得到长度
        cout << s1.size() - wpos - 1 << endl;
    }
    else 
    {
        cout << s1.size() << endl;
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Triton教程 --- 自定义操作

Triton教程 — 自定义操作 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理速率限制器模型管理 自定义操作 Triton 推理服务器部分支持允许自定义操作的建模框架。 自定义操作可以在构建时或启动时添加到 Triton&…

前端3D Three.js 在本地搭建一个官方网站

上文Web前端 3D开发入门规划 3D效果将不再是桌面应用的专利我们说了说 WEB 3D的一个发展和学习方向 那么 我们还是先搞定文档使用的问题 我们可以访问http://www.yanhuangxueyuan.com/Three.js/这里面可以查到使用方法 但不是最新的 而是别人用官方文档改的 真正的官方文档地址…

30 linux 新建进程的进程号是如何分配的?

前言 呵呵 进程号是我们经常使用到的, 但是 却从来 没有深究过的东西 这里 就来看一下 具体的进程号的生成方式 linux 新建进程是以 fork exec 的形式创建进程的 子进程 是 复制自 父进程 pid 是怎么生成的? 分配 pid 的地方调用堆栈如下, fork 之后, 会为 新进程 申…

全志V3S嵌入式驱动开发(基于usb otg的spi-nand镜像烧入)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过spi nand驱动&#xff0c;但是这个驱动是建立在linux系统从sd卡加载的情况下进行的。开发测试的情况下&#xff0c;这么做或许是可以的…

PWM详解(嵌入式学习)

这里写目录标题 前言定义参数工作原理应用练习 前言 在STM32微控制器中&#xff0c;PWM代表脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;。PWM是一种用于控制电子设备的技术&#xff0c;通过调整信号的脉冲宽度和周期&#xff0c;可以模拟出不同的电压或功率级…

【python】—— 基础语法(一)

序言&#xff1a; 在之前&#xff0c;我们已经对【python】的开发环境进行了相应的安装&#xff0c;紧接着本期我就讲给大家介绍它的相关语法。对于学过【C/C】或者其他语言的小伙伴来说&#xff0c;语法内容学习起来就会掌握的很快了。 目录 前言 &#xff08;一&#xff0…

【架构师】零基础到精通——网关策略

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名退役Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小…

vue服务端渲染SSR

一&#xff1a;ssr的理解 1、服务端渲染 Server Side Render SSR解决方案&#xff0c;后端渲染出完整的首屏的dom结构返回&#xff0c;前端拿到的内容包括首屏及完整spa结构&#xff0c;应用激活后依然按照spa方式运行&#xff0c;这种页面渲染方式被称为服务端渲染 (server si…

ISO C++ 26 并发和并行性重大完善

ISO C 委员会举行会议正式通过了 C 26 的时间表。ISO C 标准委员会主席兼微软语言架构师 Herb Sutte&#xff0c;并发和并行小组仍在按计划推进 C26 的 std::execution 和 SIMD 并行 一、 C23 与C 26 开发时间表&#xff1a; 二、C26标准属性三大规则。非正式总结是: [已经在c …

【Python 基础篇】Python数据序列推导式

文章目录 前言一、列表推导式二、字典推导式三、集合推导式总结 前言 在Python中&#xff0c;推导式&#xff08;Comprehension&#xff09;是一种简洁而强大的语法&#xff0c;用于快速创建列表、字典和集合。推导式使得在一个简单的语句中就能生成一个新的数据结构&#xff…

忘记Gmail谷歌账号密码或者密码错误怎么办?用这种方法轻松搞定

有些朋友以前注册过谷歌邮箱&#xff0c;但很久很久没有再去使用。现在注册ChatGPT需要谷歌邮箱&#xff0c;于是打算把尘封已久的谷歌邮箱找出来&#xff0c;可是这时候你突然发现&#xff0c;谷歌邮箱的密码忘了。 今天重点来说说如何找回谷歌账号的密码&#xff0c;希望能够…

英语口语进阶:让你的疲劳与口渴表达更地道

前言 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是沐风晓月&#xff0c;阿里云社区博客专家 &#x1f609;&#x1f609; &#x1f495; 座右铭&#xff1a; 先努力成长自己&#xff0c;再帮助更多的人,一起加油进…

Web网页制作期末复习(4)——CSS盒子模型、弹性盒模型(flex box)、文档流、浮动、清除浮动、定位、圆角、阴影

目录 CSS盒子模型 概念 弹性盒模型&#xff08;flex box&#xff09; 内容 父元素上的属性 display属性 flex-direction属性 justify-content属性 align-items属性 子元素上的属性 flex 文档流&#xff08;标准流&#xff09; 浮动 定义 浮动的原理 清除浮动 …

用OpenCV进行OCR字符分割

1. 引言 本文重点介绍如何利用传统的图像处理的方法来进行OCR字符切分&#xff0c;进而可以用分割后的单个字符做相应的后续任务&#xff0c;虽然现在计算机视觉依然是卷积神经网络的天下&#xff0c;但是对于一些相对简单的落地场景传统方案还是很有效的。 闲话少说&#xff…

底盘线控悬架智能化趋势

摘要&#xff1a; 汽车的底盘主要由行驶系、传动系、转向系和制动系四部分组成&#xff0c;其中行驶系又由汽车的车架、车桥、车轮和悬架等系统组成。底盘的悬架系统不仅是汽车重要的组成部分&#xff0c;而且还关乎到一辆汽车在行驶过程中的质感&#xff0c;影响车辆的操控性…

CSDN周赛59期简要题解

本期题目相对比较友好&#xff0c;而且在比赛报名界面还提示了非编程题考察的章节——诚不欺我&#xff1a; 本期非编程题需要选手阅读的章节是第2章“逆向思考——从递推到递归”—2.3节“堆栈和队列&#xff1a;遍历的数据结构” 选择和判断都考到了栈的数据结构&#xff0…

【MySQL进阶】:子查询与HAVING/SELECT的完美结合

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL子查询在HAVING/SELECT字句中使用、及相关子查询和WITH/EXISTS字句的讲解✨ 目录 前言一、在HAVING/SELECT字句中使用子查询二、相关子查询三、WITH/EXISTS、NOT EXISTS字句四、总结 一、在HAVING/SELECT字句中…

【Python 基础篇】Python 字典及字典常用函数

文章目录 导言一、字典的创建和访问二、字典的增删改查1、增加元素2、删除元素3、修改元素4、查找元素 三、字典常用函数及操作1、len()2、keys()3、values()4、items()5、字典的遍历 总结 导言 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种无序的数据…

使用它或失去它!谷歌即将清理不活跃账号

如果你很长时间没有登录你的谷歌账号&#xff0c;最好尽快登录&#xff0c;否则你很可能会失去账号。 2023年5月16号&#xff0c;谷歌宣布&#xff0c;将开始删除至少两年不活跃的账号。 如果谷歌帐户至少两年未被使用或登录&#xff0c;可能会删除该帐户及其内容&#xff0c;包…

04. 青龙面板通知配置 邮箱 pushPlus 企业微信机器人(保姆级图文)

目录 1. qq邮箱通知2. pushPlus通知3. 企业微信机器人总结 欢迎关注 『青龙面板』 专栏&#xff0c;持续更新中 欢迎关注 『青龙面板』 专栏&#xff0c;持续更新中 1. qq邮箱通知 emailUser&#xff1a;填写你的邮箱 emailPass&#xff1a;填写邮箱密钥授权码 邮箱密钥获取教…