C++ string(2)

embedded/2024/10/21 21:43:28/

在这里插入图片描述

文章目录

  • 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.ppmy.cn/embedded/129372.html

相关文章

关于Flutter 中,App内购支付集成 Google 签名的管理-手动生成签名 APK

Google play 手动生成签名 APK 1. 要创建一个 JKS&#xff08;Java KeyStore&#xff09;文件&#xff0c;可以使用 keytool 命令行工具。keytool 是 JDK 自带的工具&#xff0c;用于生成和管理密钥库和证书。 步骤 1&#xff1a;安装 JDK 确保已安装 JDK。如果未安装&#…

MySQL8.0以下版本重启后自增主键值丢失问题

文章目录 问题原因分析MySQL8.0以下版本MySQL8.0版本MySQL5.7版本 问题复现MySQL 5.7.22MySQL 8.0.23 解决方案升级MySQL到8.0业务代码预防 参考 问题 上周运维同学重启了UAT环境的MySQL数据库服务&#xff0c;刚开始我是不知道数据库重启了&#xff0c;先是业务服务开始异常&…

监控内容、监控指标、监控工具大科普

在现代信息技术领域&#xff0c;监控技术扮演着至关重要的角色。它帮助我们实时了解系统、网络、应用以及环境的状态&#xff0c;确保它们的安全、稳定和高效运行。以下是对监控内容、监控指标和监控工具的详细科普。 一、监控内容 监控内容是指监控系统所关注和记录的具体信…

企业成本与时间管理新策略 低代码自动化显身手

低代码自动化平台助力企业降本增效&#xff0c;加速数字化转型。ZohoCreator作为领先平台&#xff0c;提供可视化开发、丰富模板、自动化工作流等功能&#xff0c;广泛应用于招聘、制造、库存管理等行业&#xff0c;提升效率&#xff0c;降低成本。 一、什么是低代码自动化&…

Scrapy | 爬取笑话网来认识继承自Spider的crawlspider爬虫类

crawlspider 1. 创建crawlspider爬虫2. 实战-爬取笑话网笑话 本篇内容旨在拓展视野和知识&#xff0c;了解crawlspider的使用即可&#xff0c;主要熟悉掌握spider类的使用 CrawlSpider 提供了一种更高级的方法来定义爬取规则&#xff0c;而无需编写大量的重复代码。它基于规则…

VSCODE使用记录

1、文件或文件夹显示与搜索&#xff08;一个工程&#xff0c;不是全局的&#xff09; ①CtrlShiftP ②选择1&#xff0c;出现settings.json文件 &#xff0c;把需要屏蔽搜索的文件配置里面 { "files.encoding": "gb2312","security.workspace.trus…

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有&#xff0c;个人中心&#xff0c;用户管理&#xff0c;中介管理&#xff0c;房屋信息管理&#xff…

SpringBoot构建的智能健康生活助手

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…