《C++ Primer》练习9.43-练习9.46:替换字符串简写和插入前后缀

news2024/11/26 2:27:08

文章目录

  • 练习9.43
  • 练习9.44
  • 练习9.45
  • 练习9.46
  • 总结
  • 参考

练习9.43

练习9.43要替换字符串s中所有oldVal为newVal,要求使用迭代器和insert以及erase函数。
在这里插入图片描述

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string &
replaceAbbreviation(string &s, string oldVal, string newVal)
{
  for (auto iter = s.begin(); iter <= s.end() - oldVal.size(); ++iter)
  {
    auto olditer = oldVal.begin();
    auto temp = iter;
    while (olditer != oldVal.end() && *olditer == *iter)
    {
      olditer++;
      iter++;
    }
    iter = temp;
    if (olditer == oldVal.end())
    {
      iter = s.erase(iter, iter + oldVal.size());
      iter = s.insert(iter, newVal.begin(), newVal.end());
      iter = iter + newVal.size() - 1;//回到被插入元素的前一个位置,for循环++iter移到被插入元素继续替换,这里-1要注意
    }
  }
  return s;
}

int main()
{
  string s = "uuu";
  string oldVal = "u";
  string newVal = "auu";
  cout << s << endl;

  s = replaceAbbreviation(s, oldVal, newVal);
  cout << s;
  return 0;
}

就从左往右遍历,不过字符串匹配也可以用kmp算法,这里应该还可以优化一下,不过可以用来熟悉一下语法。测试一下:

在这里插入图片描述

学习一下别人的写法:
在这里插入图片描述

  • 使用了distance()函数
  • 使用了advance()函数
  • 使用了string{b2, e2}(b2,e2是迭代器)来得到子串
  • 使用了cbegin()cend()而不是begin()end()

练习9.44

练习9.44和9.43的目的一样,但是要求使用下标和replace进行替换。

在这里插入图片描述
按照同样的思路可以编写代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string &
replaceAbbreviation(string &s, string oldVal, string newVal)
{
  for (int i = 0; i <= s.size() - oldVal.size(); ++i)
  {
    int j = 0;
    int temp = i;
    while (j != oldVal.size() && s[i] == oldVal[j])
    {
      i++;
      j++;
    }
    i = temp;
    if (j == oldVal.size())
    {
      s.replace(i, oldVal.size(), newVal);
      i += newVal.size() - 1;//记得把i移动回去,否则可能循环终止不了
    }
  }
  return s;
}

int main()
{
  string s = "uuu";
  string oldVal = "u";
  string newVal = "auu";
  cout << s << endl;

  s = replaceAbbreviation(s, oldVal, newVal);
  cout << s;
  return 0;
}

输出结果同练习9.43

学习一下别人的写法:
在这里插入图片描述

  • 使用了substr()函数得到字符串的子串

练习9.45

练习9.45要将前缀和后缀加入名字,要求使用insert和append函数。

在这里插入图片描述

为了符合英文习惯,在生成的新的string里前缀和名字间、名字和后缀间加入了空格

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string &createNewString(string &s, string pre, string last)
{

  s.insert(s.begin(), ' ');
  s.insert(s.begin(), pre.begin(), pre.end());
  s.append(" ");
  s.append(last);
  return s;
}

int main()
{
  string s = "Mike";
  string pre = "Mr.";
  string last = "Jr.";
  cout << s << endl;
  s = createNewString(s, pre, last);
  cout << s;
  return 0;
}

输出结果:
在这里插入图片描述

需要注意的是如果使用字符串的insert要插入的是字符(用单引号表示插入的元素),其使用迭代器插入的格式可以为

s.insert(s.begin(), 'a');//在第一个元素前加入一个'a'
s.insert(s.begin(), 5, 'a');//在第一个元素前加入5个'a'
s.insert(s.begin(), {'b', 'a'});//在第一个元素前加入"ba"

不要写成(用双引号是错的):

s.insert(s.begin(), "a");//在第一个元素前加入一个'a'?
s.insert(s.begin(), 5, "a");//在第一个元素前加入5个'a'?
s.insert(s.begin(), "ab");//在第一个元素前加入"ba"

而字符串的append可以往后直接插入双引号引起来的字符串:

s.append(s.begin(), "ab");//在末尾添加一个字符串“ab”

练习9.46

练习9.46和9.45的目的一样,但是要求只使用insert函数。

在这里插入图片描述

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string &createNewString(string &s, string pre, string last)
{

  s.insert(0, " ");
  s.insert(0, pre);
  s.insert(s.size(), " ");
  s.insert(s.size(), last);
  return s;
}

int main()
{
  string s = "Mike";
  string pre = "Mr.";
  string last = "Jr.";
  cout << s << endl;
  s = createNewString(s, pre, last);
  cout << s;
  return 0;
}

输出结果同练习9.45

总结

这几道题对于字符串迭代器是一个很好的练习,replace的迭代器移动还要多多注意。

参考

  1. 《C++ Primer》345-347

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

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

相关文章

ubuntu下yolov5 tensorrt模型部署

文章目录 ubuntu下yolov5 tensorrt模型部署一、Ubuntu18.04环境配置1.1 安装工具链和opencv1.2 安装Nvidia相关库1.2.1 安装Nvidia显卡驱动1.2.2 安装 cuda11.31.2.3 安装 cudnn8.21.2.4 下载 tensorrt8.4.2.41.2.5 下载仓库TensorRT-Alpha并设置 二、从yolov5源码中导出onnx文…

【IDEA项目个别类爆红,但是项目可以正常运行】

打开项目时发现idea个别类爆红,但是项目可以正常运行 问题原因&#xff1a;Idea本身的问题&#xff0c;可能是其缓存问题&#xff0c;导致爆红 解决方案&#xff1a;重置Idea 很多时候排查不出代码问题&#xff0c;就尝试一下此操作。 选择目录&#xff1a;File–>Invalida…

前后端分离项目-基于springboot+vue的高校学科竞赛平台的设计与实现(内含代码+文档+报告)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

node.js+NPM包管理器+Webpack打包工具+前端项目搭建

javascript运行环境&#xff08;无需依赖html文件&#xff09; BFF&#xff0c;服务于前端的后端 官网下载安装&#xff0c;node -v查看是否安装成功 ①、创建一个01.js文件 //引入http模块 const httprequire(http)//创建服务器 http.createServer(function(request,respo…

微服务+Java+Spring Cloud +UniApp +MySql智慧工地综合管理云平台源码,SaaS模式

智慧工地围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效. 智慧工地综合管理云平台源码&#xff0c;PC监管端、项目端&#xff1b;APP监管端、项目端、数据可视化大屏端源码&#xf…

css案例:取消组件的阴影

点击的时候会出现阴影&#xff0c;取消阴影操作&#xff1a; .el-radio__input.is-checked{.el-radio__inner{box-shadow:0 0 0 0!important;}}有的时候取消阴影的css不起作用是权限问题&#xff0c;加上!important 就好了。

Ps:选区的布尔运算

选区的布尔 Boolean运算指的是选区之间的相加&#xff08;并集&#xff09;、相减&#xff08;差集&#xff09;以及相交&#xff08;交集&#xff09;&#xff0c;从而形成一个新的选区。 ◆ ◆ ◆ 使用工具选项栏 在 Ps 中&#xff0c;几乎所有的选区工具的工具选项栏上都有…

php新手实战:自定义书源下载api

网上有很多第三方小说网站提供小说下载&#xff0c;而下载的过程无非就是搜索书籍&#xff0c;然后找到下载链接点击下载即可。只是类似这种“良心”的小说网站实在是太少。大多数仅支持在线阅读。而如今&#xff0c;我却要利用这种为数不多的“良心”小说站点提供的书源来作为…

Eureka添加@Loadbalanced 报错 No instances available for XXXXX

错误显示为 错误信息是:没有可用的实例 我就比较惊讶 我已经添加了Loadbalanced 同时将RestTemplate注册到spring容器中了 为什么还会出现没有实例.. 下面是代码 仔细检查了代码发现没什么错误之后 检查了一下 xml文件,发现里面的 应用名称与访问时参数一致.这个时候就陷…

Elasticsearch:使用 LangChain 对话链和 OpenAI 的聊天机器人

在此笔记本中&#xff0c;我们将构建一个聊天机器人&#xff0c;它可以回答有关自定义数据的问题&#xff0c;例如雇主的政策。 聊天机器人使用 LangChain 的 ConversationalRetrievalChain&#xff0c;具有以下功能&#xff1a; 用自然语言回答问题在 Elasticsearch 中运行混…

Postman持久化保存/设置断言详解

postman持久化保存 1、点击postman的Collections页签&#xff0c;点击 New Collection创建&#xff08;可以当成项 目并重命名&#xff09; 2、新增后&#xff0c;再点击Collection中的“ ... ” &#xff0c;然后点击“Add Folder”&#xff0c;新建一个文件 夹&#xff08…

是否拥有具身智能,是扫地机器人能否打破“内卷”的关键

如果你关注2023世界人工智能大会等行业峰会&#xff0c;以及英伟达、微软、谷歌、特斯拉和国內科技大厂的最新发布会&#xff0c;除了“大模型”&#xff0c;应该会听到另一个高频词——具身智能。 所谓具身智能Embodied AI &#xff0c;指的是有身体并支持物理交互的智能体。这…

【计网】傻瓜式安装cpolar内网穿透

目录 一、注册账户 二、下载安装包 三、安装 四、查看AuthToken 五、简单使用 如果在本机部署项目外网是访问不到的&#xff0c;通过内网穿透就可以使本机部署的项目可被外网访问 一、注册账户 cpolar - secure introspectable tunnels to localhostcpolar secure intro…

3. Windows下C++/MFC调用hiredis库操作redis示例

一、头文件目录 将之前下载和编译好的Redis目录拷贝到新建好的工程目录下面&#xff0c;再点击测试工程的右键/属性&#xff0c;点击C/常规&#xff0c;附加包含目录添加以下路径&#xff0c;注意如果原先有多个路径&#xff0c;在末尾处添加分号后再粘贴&#xff1a; 点击C/常…

谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)

有一个5*5的网格&#xff0c;其中恰好有一个格子是空的&#xff0c;其他格子各有一个字母。一共有4种指令&#xff1a;A, B, L, R&#xff0c;分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列&#xff08;以数字0结束&#xff09;&#xff0c;输出指…

深入promise

深入promise 我们可能知道如何使用 Promise&#xff0c;但是我们知道它们实际上是如何工作的吗&#xff1f; 为了让每个人都了解Promise&#xff0c;让我们从基础开始。如果我们知道 Promise 是什么以及如何使用它&#xff0c;我们可以跳过这一部分并直接跳到“魔法开始”的地…

Halcon中涉及的数字图像十大理论知识

1.图像处理知识 2.图像的灰度变换 3.图像增强 4.图像的几何变换 5.图像分割 6.图像的频域 7.图像的形态学 8.图像的复原 9.运动图像 10.图像配准

uni-app--》基于小程序开发的电商平台项目实战(五)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

Spring实战 | Spring AOP核心功能分析之葵花宝典

国庆中秋特辑系列文章&#xff1a; 国庆中秋特辑&#xff08;八&#xff09;Spring Boot项目如何使用JPA 国庆中秋特辑&#xff08;七&#xff09;Java软件工程师常见20道编程面试题 国庆中秋特辑&#xff08;六&#xff09;大学生常见30道宝藏编程面试题 国庆中秋特辑&…

实验3:左右循环LED灯

获取流水灯工程&#xff1a; 方式一&#xff1a; keilproteus 完成最小系统&#xff0c;点亮led 灯实验_吴小凹的博客-CSDN博客 方式二&#xff1a; Flowing_led.zip - 蓝奏云直接下载。 原理图修改&#xff1a; 无须修改只需要使用流水灯的工程即可&#xff0c;解压到桌面…