【C++数据结构 | 字符串速通】10分钟秒杀字符串相关操作 | 字符串的增删改查 | 字符串与数组相互转换
字符串
by.Qin3Yu
文中所有代码默认已使用std命名空间且已导入部分头文件:
#include <iostream>
#include <string>
using namespace std;
概念速览
- 字符串是一种非常好理解的数据类型,它用于存储和操作文本数据。字符串可以包含任意字符,包括字母、数字、特殊符号和空格等等。如下,是每个编程初学者几乎都会使用到的字符串:
cout << "Hello World";
- 字符串(string) 和 字符数组(char[]) 都可以存储多个字符,但是他们之间的却有着很大的区别,简单来说,字符串相比于字符数组有着以下优缺点:
优点:
1.方便操作: 字符串提供了许多方便的操作方法,如拼接、截取、查找、替换等。
2.动态内存: 字符串的长度是动态管理的,无需手动跟踪和更新。
3.可常量化: 字符串常量可以直接在代码中使用,而不需要手动创建和初始化字符数组。缺点:
1.不可修改: 大多数编程语言中的字符串是不可修改的,即无法直接更改字符串中的单个字符。
- 总之,字符串与字符数组相比具有更多的功能和便利性,但在对性能要求较高的情况下,字符数组可能是更好的选择。选择使用哪种类型取决于具体的应用场景和要求。
字符串操作
声明(string)与输入(cin)输出(cout)
- 在导入了 <string> 头文件后,我们可以直接使用 string 关键字来声明一个字符串,然后使用C++的 标准输入输出流 来进行输入和输出。需要注意的是,字符串需要 用双引号进行包裹 :
string st; // 声明一个字符串
cin >> st; // 输入字符串
cout >> st // 打印字符串
string st2 = "Genshin"; // 声明并初始化一个 "Genshin" 字符串
- 需要注意:在上面的st2字符串中初始化字符串时,字符串末尾实际还会存在一个null终止符,当某些遍历方法遍历到此终止符时就知道此字符串被遍历完了,如下图所示:
获取长度(length)与截取(substr)
- 在字符串中,可以使用std::string类中的 length() 成员方法获取字符串的长度,或是使用 substr() 截取字符串。
- 其中,substr() 有两种常用形式,它可以接受两个参数 (m,n) ,表示截取下标m~n的子字符串,或者接受一个参数 m ,表示截取从下标为m开始的后面所有字符串,如下面的代码所示:
string st = "Genshin";
int len = st.length(); // len = 7
string s1 = st.substr(2,4); // s1 = nsh
string s2 = st.substr(3); // s2 = shin
查找(find)
- 在字符串操作中,有两种常用方法查找字符串中的指定子串,分别是 find() 和 rfind() ,它们两者的区别在于 find() 会返回子字符串第一次出现在字符串中的位置,而 rfind() 会返回子字符串最后一次出现在字符串中的位置。如下图所示,它们都会返回 子串的第一个字符在字符串中的索引 :
string st = "Genshins";
int a = st.find("ns"); // a = 2
int b = st.rfind("ns"); // a = 6
- 假如字符串中没有匹配的子串,那么 ®find 函数将会返回一个 string::npos 值,这个值解释起来稍显复杂,但是在实际应用中,读者可以直接用 if 语句如下检测 ®find 函数是否返回了 string::npos :
if (pos == string::npos) { }
替换(replace)
- 在字符串中,我们还可以使用 replace() 方法来修改指定片段的字符串。replace() 方法会接受三个参数,分别是 开始位置的索引、结束位置的索引和需要替换成的字符串 ,如下图所示,使用 replace() 替换字符串后,字符串会 自动调节大小 :
string st = "Genshin";
st.replace(2,4,"mihoyo"); // st = "Gemihoyoin" , st.length() = 9
st.replace(2,4,"6"); // st = "Ge6in" , st.length() = 5
插入(insert)与删除(erase)
- 关于字符串的修改,C++ 还有两种基本的方法,分别是 insert() 和 erase() 。insert() 方法接受两个参数,分别是要 插入位置的下标和要插入的子串 ,插入后,子串的首字符会在第一个参数处,如下图所示:
string st = "Genshin";
st.insert(3,"666"); // st = "Gen666shin"
- 同样,erase() 方法也会接受两个参数,分别是要删除片段的 起始和结束位置的下标 ,如下图所示:
string st = "Genshin";
st.erase(1,5); // st = "Gn"
拼接(+ & append)
- 最后,有两种方式可以将两个字符串拼接在一起,分别是直接使用 +号 和使用 append()方法 ,二者在使用上也有部分不同。
- 将两个字符串直接使用 +号 连接,并传递给第三个字符串,原先的两个字符串没有做出任何修改:
string s1 = "Gen";
string s2 = "shin";
string s3 = s1 + s2; // s3 = "Genshin"
- 如下使用 append() 方法,append() 接受一个参数,即需要拼接的字符串,方法将会直接将子串拼接在字符串 st 后面,不需要第三个字符串:
string s1 = "Gen";
string s2 = "shin";
s1.append(s2); // s1 = "Genshin"
string与char[]的相互转换
- 在实际应用中,如果我们需要对字符串进行大量的修改,那么将 字符串(string) 转换为 字符数组(char[]) 再进行修改会是更好的选择。可以如下使用 data()方法 配合 copy()方法 将字符串转换为一个可修改的字符数组。特别注意,为了保证转换时的数据正确性,字符串与字符数组相互转换时,字符数组必须以终止符 ‘\0’ 结尾,因此,字符数组的长度要比字符串长1个字符:
string st = "Genshin";
char s[st.length() + 1]; // 声明一个字符数组,长度为字符串长度+1
copy(st.data(), st.data() + st.length() + 1, s); // 复制字符串到字符数组中
- 再进行相关操作后,我们需要把字符数组再转换为字符串,我们可以直接使用 string 的构造函数 string(CharArray) 直接传入一个字符数组进行初始化,如下所示:
char s[] = {'G','e','n','s','h','i','n','\0'};
string st(s); // st = "Genshin"
至此,字符串的相关内容已讲解完毕(=
如需提问,可以在评论区留言或私信(=
感谢您的阅读(=
by.Qin3Yu
相关文章:

【C++数据结构 | 字符串速通】10分钟秒杀字符串相关操作 | 字符串的增删改查 | 字符串与数组相互转换
字符串 by.Qin3Yu 文中所有代码默认已使用std命名空间且已导入部分头文件: #include <iostream> #include <string> using namespace std;概念速览 字符串是一种非常好理解的数据类型,它用于存储和操作文本数据。字符串可以包含任意字符…...

运动重定向:C-3PO
C-3PO: Cyclic-Three-Phase Optimization for Human-Robot Motion Retargeting based on Reinforcement Learning解析 摘要1. 简介2. 相关工作2.1 运动重定向(Motion Retargeting)2.2 强化学习(Reinforcement Learning) 3. 预备知…...

天池SQL训练营(四)-集合运算-表的加减法和join等
-天池龙珠计划SQL训练营 4.1表的加减法 4.1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 U…...

thinkphp lists todo
来由: 数据库的这个字段我想返回成: 新奇的写法如下: 逻辑层的代码: public function goodsDetail($goodId){$detail $this->good->where(id, $goodId)->hidden([type_params,user_id])->find();if (!$detail) {ret…...
【Flutter】创建应用顶级组件,应用根组件 (学习记录)
前言 在 Flutter 中,应用的顶级组件或根组件通常是在 main() 函数中通过 runApp() 方法创建的。这个组件通常是一个 MaterialApp、CupertinoApp、GetMaterialApp 或其他类似的应用框架组件。 以下是一个创建 MaterialApp 作为根组件的示例: void main()…...

AI材料专题报告:AI革命催生新需求国产替代推动新方向
今天分享的AI系列深度研究报告:《AI材料专题报告:AI革命催生新需求国产替代推动新方向》。 (报告出品方:光大证券) 报告共计:25页 1、算力需求增长催生 800G 光模块需求 算力是数字经济时代新生产力&…...

JVM 分析GC日志
GC日志参数 -verbose:gc 输出gc日志信息,默认输出到标准输出 -XX:PrintGC 输出GC日志。类似:-verbose:gc -XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况 -XX:PrintGCTimeStam…...
阿里云服务器环境配置,ssh免密登录和配置docker
此文章适合ubuntu20.04 64位和ubuntu22.04 64位版本 一.登陆服务器 租完服务器后,首选需要使用本地gitbash或者cmd进入服务器, 命令: ssh rootxxx xxx为服务器公网ip,然后yes,然后输入密码就会进入自己的服务器&am…...

【LeetCode】2621. 睡眠函数
睡眠函数 Promise异步 题目题解 题目 请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1: 输入:millis 100 输出:100 解释: 在 100ms 后此异步…...

网络入门---TCP通信实现
目录标题 前言准备工作 tcpserver.hpp构造函数初始化函数(listen)运行函数(accept) tcpserver.cctcpclient.hpp构造函数初始化函数运行函数(connect) tcpclient.cc问题测试改进一:多进程改进二:多线程改进三:线程池完整代码 前言 在前面的文…...

neuq-acm预备队训练week 8 P2661 [NOIP2015 提高组] 信息传递
题目背景 NOIP2015 Day1T2 题目描述 有 n 个同学(编号为 1 到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学。 游戏开始时,每人都…...
《C++新经典设计模式》之第18章 备忘录模式
《C新经典设计模式》之第18章 备忘录模式 备忘录模式.cpp 备忘录模式.cpp #include <iostream> #include <vector> #include <memory> using namespace std;// 保存对象内部状态,必要时恢复 // 在不破坏封装性的前提下,捕获对象的内部…...

OWASP安全练习靶场juice shop-更新中
Juice Shop是用Node.js,Express和Angular编写的。这是第一个 完全用 JavaScript 编写的应用程序,列在 OWASP VWA 目录中。 该应用程序包含大量不同的黑客挑战 用户应该利用底层的困难 漏洞。黑客攻击进度在记分板上跟踪。 找到这个记分牌实际上是&#…...

当使用RSA加密,从手机前端到服务器后端的请求数据存在+
将转成了空格,导致解密出错 将空格转成了...

BUUCTF crypto做题记录(3)新手向
目录 一、Rabbit 二、篱笆墙的影子 三、丢失的MD5 四、Alice与Bob 一、Rabbit 得到的密文:U2FsdGVkX1/ydnDPowGbjjJXhZxm2MP2AgI 依旧是看不懂是什么编码,上网搜索,在侧栏发现Rabbit解码,直接搜索就能有在线解码网站 二、篱笆…...

SpringMVC修炼之旅(2)基础入门
一、第一个程序 1.1环境配置 略 1.2代码实现 package com.itheima.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//定义…...

matlab 最小二乘拟合空间直线(方法二)
目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理...
ASPICE-汽车软件开发能力评级
Automotive SPICE(简称A-SPICE 或 ASPICE),全称是“Automotive Software Process Improvement and Capacity dEtermination”,即“汽车软件过程改进及能力评定”模型框架。 常被用于评估一家汽车软件供应商的软件开发能力&#x…...

准确!!!在 CentOS 8 上配置 PostgreSQL 14 的主从复制
在 CentOS 8 上配置 PostgreSQL 14 的主从复制,并设置 WAL 归档到特定路径 /home/postgres/archive 的步骤如下: 主服务器配置(主机) 配置 PostgreSQL: 编辑 postgresql.conf 文件: vim /data/postgres/p…...

leetcode 1466
leetcode 1466 使用dfs 遍历图结构 如图 node 4 -> node 0 -> node 1 因为节点数是n, 边长数量是n-1。所以如果是从0出发的路线,都需要修改,反之,如果是通向0的节点,例如节点4,则把节点4当作父节点的节点&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...