C++ string(2)

在这里插入图片描述

文章目录

  • 1.初识迭代器和范围for
    • 1.1迭代器
    • 1.2范围for
    • 1.3 aout关键字
  • 2.字符串长度相关计算
    • 1.size 和 length
    • 2. capacity 和 reserve
  • 3.例题演示
    • 1. [917. 仅仅反转字母 - 力扣(LeetCode)](https://leetcode.cn/problems/reverse-only-letters/description/)
    • 2. [387. 字符串中的第一个唯一字符 - 力扣(LeetCode)](https://leetcode.cn/problems/first-unique-character-in-a-string/description/)
    • image-20241021201950153

1.初识迭代器和范围for

1.1迭代器

上次我们知道了可以通过operator[]重载了后,可以直接访问字符串:

Test01()
{string s1;string s2("hello world");s2[0] = 'x';cout << s1 << s2 << endl;//下标加[]重载for (size_t i = 0; i < s2.size(); i++){cout << s2[i] << " " ;}cout << endl;
}

而我们也可以通过迭代器来实现,实现的方式与指针相仿,而且所有的容器都能使用:

string::iterator it = s2.begin();
while (it != s2.end())
{cout << *it << " ";++it;
}
cout << endl;

image-20241014184335471

也有反向的迭代器:

string::reverse_iterator rit = s2.rbegin();
while (rit != s2.rend())
{cout << *rit << " ";++rit;
}
cout << endl;

当然结果也是相反的:

image-20241016194503303

但是这样里面的内容可以被修改,如果字符串本身不能修改,那么就会将权限放大,这时就有以下这种写法了:

const string s3("hello world");
string::const_iterator lt = s3.begin();
//auto = s3.begin();
while (lt != s3.end())
{cout << *lt << " ";lt++;
}
cout << endl;//string::const_reverse_iterator rlt = s3.rbegin();
auto rlt = s3.rbegin();
while (rlt != s3.rend())
{cout << * rlt << endl;rlt++;
}

image-20241016200615323

1.2范围for

  • 对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此 C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围 内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。

  • 范围for可以作用到数组和容器对象上进行遍历

  • 范围for的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到。

for (auto ch : s2)//字符赋值,自动迭代,自动判断结束
{cout << ch << " ";
}
cout << endl;

auto 为自动推导为类型,这里推导char

所以我们可以通过范围for进行数组的遍历:

image-20241014194319961

如果要修改数据auto&就可以了

1.3 aout关键字

  • 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个 不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型 指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期 推导而得。

  • 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

  • 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际 只对第一个类型进行推导,然后用推导出来的类型定义其他变量。 auto不能作为函数的参数,可以做返回值,但是建议谨慎使用

  • auto不能直接用来声明数组

#include<iostream>
using namespace std;
int func1()
{
return 10;
}
// 不能做参数
void func2(auto a)
{}
// 可以做返回值,但是建议谨慎使用
auto func3()
{
return 3;
}
int main()
{
int a = 10;
auto b = a;
auto c = 'a';
auto d = func1();
// 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
auto e;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
int x = 10;
auto y = &x;
auto* z = &x;
auto& m = x;
cout << typeid(x).name() << endl;
cout << typeid(y).name() << endl;
cout << typeid(z).name() << endl;
auto aa = 1, bb = 2;
// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
auto cc = 3, dd = 4.0;
// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
auto array[] = { 4, 5, 6 };
return 0;
}

这样我们前面的代码也能优化了

string::iterator it = s2.begin();
while (it != s2.end())
{cout << *it << " ";++it;
}
cout << endl;

2.字符串长度相关计算

1.size 和 length

这里有两种方式去解决:

string s1("hello world");
cout << s1.length() << endl;     //11
cout << s1.size() << endl;       //11

两种方式的方式是一样滴,但是我们经常用size

image-20241016202800812

2. capacity 和 reserve

  1. capacity可以计算出字符串开出的空间

  2. reserve保留所对应的空间,也可以提前开空间避免扩容,提高效率

    但是reserve一般来说在Vs下就不存在缩容,但是不同平台有不同的标准

image-20241021192540182

例如:

image-20241021191912061

  1. clear用来清理数据但是一般来说不清理容量

image-20241021194714488

3.例题演示

1. 917. 仅仅反转字母 - 力扣(LeetCode)

image-20241021195455184

这里有两个问题:

  1. 要求让字符反转
  2. 但是字符不能反转

我们优先写一个判断是否时字母的函数:

bool isLetter(char ch) {if (ch >= 'a' && ch <= 'z')return true;if (ch >= 'A' && ch <= 'Z')return true;return false;}

那我们能用逆向迭代器吗?

首先正向迭代器和逆向迭代器的类型上就不一样,无法向指针一样直接比较,

但是同时用向迭代器或者同时用反向迭代器是可以的

例如:

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) {auto left = s.begin();auto right = s.end() - 1;while (left < right) {if (!isLetter(*left)) {left++;} else if (!isLetter(*right)) {right--;} else {swap(*left, *right);left++;right--;}}return s;}
};

但是相比于下标就要复杂很多了
后续代码:

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) {int left = 0;int right = s.size() - 1;while (left < right) {while (left < right && !isLetter(s[left])) {++left;}while (left < right && !isLetter(s[right])) {--right;}swap(s[left++], s[right--]);}return s;}
};

注意这里的判断,如果不加前面的在无字符的情况下直接访问越界了

while (left < right && !isLetter(s[left])) {++left;}
while (left < right && !isLetter(s[right])) {--right;}

2. 387. 字符串中的第一个唯一字符 - 力扣(LeetCode)

image-20241021201950153

这道题可以直接进行比较,但是时间复杂度就比较高了

例如:

class Solution {
public:int firstUniqChar(string s) {int r = s.size();for (int i = 0; i < r; i++) {bool isUnique = true;for (int j = 0; j < r; j++) {if (i!= j && s[i] == s[j]) {isUnique = false;break;}}if (isUnique) {return i;}}return -1;}
};

后续的改进我们放到下次string(3)的前面进行讲解

后续会将C语言数据结构的排序部分更完在进入string(3)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring day 1021

ok了家人们&#xff0c;这周学习spring框架&#xff0c;我们一起去看看吧 Spring 一.Spring概述 1.1 Spring介绍 官网&#xff1a; https://spring.io/ 广义的 Spring &#xff1a; Spring 技术栈 &#xff08;全家桶&#xff09; 广义上的 Spring 泛指以 Spring Framework…

Spring AI 整体介绍_关键组件快速入门_prompt_embedding等

Spring AI&#xff1a;Java开发者的AI集成新利器 在过去&#xff0c;Java开发者在构建AI应用时面临着缺乏统一框架的问题&#xff0c;导致不同AI服务的集成过程复杂且耗时。Spring AI应运而生&#xff0c;旨在为基于Java的应用程序提供一个标准化、高效且易于使用的AI开发平台…

浅说差分算法(下)

我们上节课学了一维的差分&#xff0c;但其实还有二维差分&#xff0c;只是比较难写。 差分 二维差分的定义 二维差分是指对于一个n*m的矩阵a&#xff0c;要求支持操作pro(x1,y1,x2,y2,a)&#xff0c;表示对于以(x1,y1)为左上角&#xff0c;(x2,y2)为右下角的矩形区域&#…

生产车间质量管理有什么用?怎么做?

在生产车间的质量管理中&#xff0c;科学有效的管理方法和严格规范的执行流程是至关重要的&#xff0c;它能够帮助企业提高产品质量、降低次品率、确保生产过程的稳定性和效率。然而&#xff0c;许多企业在生产车间质量管理方面存在诸多问题&#xff0c;常常会面临以下困境&…

多微批量自动加好友

在数字化时代&#xff0c;微信不仅是社交通讯的工具&#xff0c;更是一个拥有庞大用户基础的流量平台。对于企业而言&#xff0c;微信是打造私域流量池的理想选择之一。然而&#xff0c;随着微信号的增多&#xff0c;手动添加好友和备注变得既繁琐又耗时。幸运的是&#xff0c;…

UNI VFX Missiles Explosions for Visual Effect Graph

Unity URP和HDRP的通用视觉效果 使用在视觉效果图中制作的高性能GPU粒子系统。 无需进入视觉效果图编辑器即可轻松自定义VFX。 使用(VFX)事件——一个游戏对象可存储多个效果,这些效果可通过C#或视觉脚本触发。 总共32个事件(不包括“停止”事件)。 ❓ 什么是(VFX)事件?…

Cpp::STL—容器适配器Stack和Queue的讲解和模拟实现(15)

文章目录 前言一、适配器模式概念分类 二、Stack核心作用代码实现 三、Queue核心作用代码实现 四、deque双端队列貌似兼收并蓄&#xff1f;实则也难以兼得~ 总结 前言 适配器也是STL六大组件之一&#xff0c;请跟我一起领悟它的智慧&#xff01;   正文开始&#xff01; 一、…

consumer 角度讲一下i2c外设

往期内容 I2C子系统专栏&#xff1a; I2C&#xff08;IIC&#xff09;协议讲解-CSDN博客SMBus 协议详解-CSDN博客I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg-CSDN博客内核提供的通用I2C设备驱动I2c-dev.c分析&#xff1a;注册篇内核提供的通用I2C设备驱动I2C-dev.…

浅析建造者模式

建造者模式 一、基础知识介绍 1. 问题引出 上图面存在的问题&#xff1a;产品和产品创建的过程是封装在一起的。耦合性太强 解决方法: 将二者解耦和 2.建造者模式介绍 将复杂对象的构造过程抽象出来&#xff0c;用户不用知晓里面的构建细节 3.四个角色 建造者模式的四个角…

Java项目-基于springboot框架的财务管理系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

【element-tiptap】如何修改选中内容时的背景颜色?

前言&#xff1a;element-tiptap 用鼠标选中内容的时候&#xff0c;背景颜色跟系统设置的主题有关&#xff0c;比如的我的就是卡哇伊的pink&#xff0c;默认是淡蓝色 但是我们观察一下语雀&#xff0c;背景颜色是它规定好的颜色 这篇文章来探索一下&#xff0c;怎么自己规定选…

实操上手TinyEngine低代码引擎插件化开发

1.背景介绍 1.1 TinyEngine 低代码引擎简介 低代码开发是近些年非常热门的一种开发方式&#xff0c;用户可以通过可视化的方式&#xff0c;简单拖拽&#xff0c;不写代码或者编写少量代码&#xff0c;类似搭积木一样搭建业务应用。 TinyEngine是一个强大的低代码引擎&#x…

企业博客SEO优化:8个必备工具与资源指南

在当今数字化时代&#xff0c;企业博客已远远超越了传统意义上的信息展示平台。它不仅是企业展示品牌形象、传递品牌价值的重要窗口&#xff0c;更是吸引潜在客户、增强用户粘性、提升网站流量和搜索引擎排名的关键。通过精心策划和高质量的内容创作&#xff0c;企业博客能够建…

ChatGPT4o、o1 谁才是最佳大模型?

如何选择合适的 ChatGPT 模型&#xff1f;OpenAI 更新细节与 GPTs 的深入解析 随着人工智能的发展&#xff0c;ChatGPT 已成为众多用户的强大助手&#xff0c;广泛应用于写作、编程、学习和商业等多个领域。然而&#xff0c;面对 OpenAI 提供的众多模型&#xff08;如 GPT-4、…

idea中,git提交时忽略某些本地修改.将文件从git暂存区移除

我们有时候在本地调试代码时&#xff0c;某些配置文件需要修改成本地环境中。当改完后&#xff0c;需要提交代码时&#xff0c;这些文件又不能推到git上。如下图&#xff1a; 当出现这种情况&#xff0c;我们每次都需要手动去将不需要提交的文件的对号去掉。文件多了后&#x…

[Redis] 在Linux中安装Redis并连接图形化工具详细过程(附下载链接)

前言 安装Redis之前应该在虚拟机中安装Linux系统&#xff0c;这里使用centos7版本 [linux] 在VMware中安装linux、文件下载及详细安装过程&#xff08;附下载链接&#xff09;-CSDN博客 安装Linux后&#xff0c;更换yum源为阿里云并安装gcc依赖 [Linux] CentOS7替换yum源为阿…

Rust 语言持续崛起,即将冲击 TIOBE 指数前十,能否成为编程语言新王者?

Rust 语言持续崛起&#xff0c;即将冲击 TIOBE 指数前十&#xff0c;能否成为编程语言新王者&#xff1f; 2024 年 10 月&#xff0c;全球编程语言 TIOBE 排行榜再次更新&#xff0c;各大编程语言在各自领域中继续发挥着独特的优势。官方的标题是&#xff1a; Rust排名稳步攀升…

【代码随想录Day47】单调栈Part02

42. 接雨水 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;单调栈&#xff0c;经典来袭&#xff01;LeetCode:42.接雨水_哔哩哔哩_bilibili 思路概述 问题理解&#xff1a;我们需要计算在给定柱子高度之间可以接住的雨水总量。雨水的量取决于柱子的高度和它们…

PP-ChatOCRv3—文档场景信息抽取v3产线使用教程

文档场景信息抽取v3产线使用教程 1. 文档场景信息抽取v3产线介绍 文档场景信息抽取v3&#xff08;PP-ChatOCRv3&#xff09;是飞桨特色的文档和图像智能分析解决方案&#xff0c;结合了 LLM 和 OCR 技术&#xff0c;一站式解决版面分析、生僻字、多页 pdf、表格、印章识别等常…

有同学问:拿到大厂JAVA OFFER,但是会不会不稳定,有失业风险?!

昨天在直播里面有一个同学说拿到了大厂的offer&#xff0c;但是最近看了很多很多的报道&#xff0c;说大厂Java会不会也失业&#xff1f; 前两天也有家长私信咨询说孩子去了外企&#xff0c;拿着23K的工资&#xff0c;会不会也不稳定&#xff1f; 现在很多同学看了新闻报道或…