C++之STL整理(6)之string 用法(拼接、查找、替换、比较、截取子串)整理

C++之STL整理(6)之string 用法(拼接、查找、替换、比较、截取子串)整理

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的string用法整理

  • C++之STL整理(6)之string 用法(拼接、查找、替换、比较、截取子串)整理
  • 一、string的拼接
    • 1、字符串加法(拼接操作)
    • 2、append函数
  • 二、字符串查找和替换
    • 1、find
    • 2、rfind
    • 3、替换
  • 三、比较与子串获取
    • 1、字符串比较操作
    • 2、字符串子串
  • 总结


提示:本文为 C++ 中 string替换、比较、子串的写法和举例


一、string的拼接

  C++ 中的 std::string 是一个非常强大的类,它提供了丰富的成员函数和操作符重载(关于string的基本操作),用于操作字符串。下面讲解其他的函数

1、字符串加法(拼接操作)

operator+=(const string& str);重载了加号+,两个string类的字符串可以直接相加:

string s = "Hello, ";  
s += "world!"; // s 现在为 "Hello, world!"

operator+=(const char* str);重载了加号+,可以与char*的字符串直接相加:

string s = "Hello, ";  
s += "world!"; // s 现在为 "Hello, world!"

operator+=(const char c);重载了加号+,可以与char的单个字符直接相加:

string s = "Hello";  
s += ','; // s 现在为 "Hello,"

2、append函数

append(...) 成员函数的行为与 operator+= 类似,只是名称不同。上述代码都可以转化为:

string s = "Hello";  
s.append(...);

二、字符串查找和替换

1、find

成员函数find(字符或字符串)返回的是所查找的子串或字符在主串中首次出现的那个位置的索引。如果未找到子串或字符,则find会返回std::string::npos,这是一个特殊的常量,用来表示未找到或超出范围的索引。
find(…)

string s = "Hello, world!";  
int pos = s.find("world"); // pos 为 7

2、rfind

rfind(…)意思是reverse的find
rfind成员函数返回的是所查找的子串或字符在主串中最后一次出现的位置的索引。如果未找到子串或字符,则rfind会返回std::string::npos,就像find函数一样。使用rfind时,它从字符串的末尾开始向前搜索,找到所查找的子串或字符最后一次出现的位置。

string s = "hello, hello, world";  
int pos = s.rfind("he"); // pos 为 7

3、替换

replace(...)成员函数不返回任何值(即返回类型为void),它直接修改调用它的字符串对象,将指定的子串或字符替换为另一个子串或字符。replace函数有多个重载版本,每个版本接受不同数量和类型的参数,以便以不同的方式执行替换操作。

以下是replace函数的一些常见重载版本及其参数的含义:

使用位置和计数进行替换

void replace(size_t pos1, size_t count, const string& str);  
void replace(size_t pos1, size_t count, const char* s);  
void replace(size_t pos1, size_t count, size_t count2, char c);
pos1:开始替换的位置的索引。
count:要替换的字符数。
str 或 s:用于替换的新字符串。
count2 和 c:用count2个字符c替换原字符串中的count个字符。

使用迭代器进行替换

void replace(iterator i1, iterator i2, const string& str);  
void replace(iterator i1, iterator i2, const char* s);  
void replace(iterator i1, iterator i2, size_t count, char c);
i1 和 i2:定义要替换的字符范围的迭代器。
str 或 s:用于替换的新字符串。
count 和 c:用count个字符c替换原字符串中由迭代器定义的范围内的字符。

使用子串进行替换

void replace(const_iterator i1, const_iterator i2, const string& str, size_t pos, size_t count);  
void replace(size_t pos1, size_t count1, const string& str, size_t pos, size_t count);
i1 和 i2 或 pos1 和 count1:定义要替换的字符范围。
str:源字符串,从中提取子串进行替换。
pos:在str中开始提取子串的位置。
count:从str中提取的字符数。

每个重载版本都允许你以不同的方式指定要替换的字符范围以及用于替换的内容。在调用replace函数时,你需要根据你的具体需求选择适当的重载版本,并提供正确的参数。请注意,replace函数直接修改调用它的字符串对象,而不返回任何新字符串。如果你需要保留原始字符串并创建一个包含替换结果的新字符串,你需要先复制原始字符串,然后对新字符串对象调用replace。

string s = "apple";  
s.replace(1, 3, "cherry"); 
// s 现在为 "acherrye",可以理解为第一步删去起始位置开头的指定长度的部分
// 第二步把第一步删去的部分替换为cherry

三、比较与子串获取

1、字符串比较操作

compare函数用于比较两个字符串,使用compare函数时,如果返回值为0,则表示两个字符串相等;如果返回值小于0,则表示调用字符串字典序上小于比较字符串;如果返回值大于0,则表示调用字符串字典序上大于比较字符串。

compare函数有多个重载版本,允许你以不同的方式比较字符串。以下是compare函数的一些常见重载版本及其参数的含义:

比较整个字符串

int compare(const string& str) const noexcept;  
int compare(const char* s) const;

str 或 s:要与本字符串比较的字符串。
返回值:如果调用字符串小于、等于或大于比较字符串,则分别返回负整数-1、零或正整数1。

比较字符串的前n个字符

int compare(size_t pos1, size_t count1, const string& str) const;  
int compare(size_t pos1, size_t count1, const char* s) const;  
int compare(size_t pos1, size_t count1, const string& str, size_t pos2, size_t count2) const;  
int compare(size_t pos1, size_t count1, const char* s, size_t count2) const;

pos1 和 count1:定义调用字符串中用于比较的子串的起始位置和长度。
str 或 s:要与之比较的字符串。
pos2 和 count2(在相关重载中):定义比较字符串中用于比较的子串的起始位置和长度。
返回值:与上述相同,根据字典序比较结果返回相应的整数值。
使用C风格的字符串和长度进行比较

int compare(size_t pos, size_t count, const char* s, size_t count2) const;

pos 和 count:定义调用字符串中用于比较的子串的起始位置和长度。
s 和 count2:定义C风格字符串中用于比较的子串的起始位置和长度。
返回值:与上述相同。

这里有一个简单的示例,展示了如何使用compare函数:

#include <iostream>  
#include <string>  int main() {  std::string str1 = "apple";  std::string str2 = "banana";  std::string str3 = "apple";  const char* cstr = "apple";  // 比较整个字符串  int result1 = str1.compare(str2); // str1 < str2,返回负整数  int result2 = str1.compare(str3); // str1 == str3,返回0  int result3 = str1.compare(cstr); // str1 == cstr,返回0  // 比较字符串的前n个字符  int result4 = str2.compare(0, 4, str1); // 比较"bana"和"appl",返回正整数  int result5 = str2.compare(0, 5, "apple"); // 比较"banan"和"apple",返回正整数  // 输出比较结果  std::cout << "Result 1: " << result1 << std::endl;  std::cout << "Result 2: " << result2 << std::endl;  std::cout << "Result 3: " << result3 << std::endl;  std::cout << "Result 4: " << result4 << std::endl;  std::cout << "Result 5: " << result5 << std::endl;  return 0;  
}

在这个示例中,我们比较了不同字符串以及字符串的子串,并打印了比较结果。根据比较结果的正负或零,我们可以确定字符串之间的字典序关系。

2、字符串子串

substr(...)函数用于获取字符串的一个子串。这个函数返回一个新的std::string对象,该对象包含从原字符串的指定位置开始,具有指定长度的字符序列

substr函数的原型如下:

std::string substr(size_t pos = 0, size_t count = npos) const;

pos:子串开始的位置索引。默认值为0,即从字符串的开始位置提取。
count:子串中字符的数量。默认值是std::string::npos,这是一个特殊的常量,表示从pos位置开始直到字符串的末尾。

以下是一些使用substr函数的例子:

#include <iostream>  
#include <string>  int main() {  std::string str = "Hello, World!";  // 获取从索引0开始的5个字符的子串  std::string substr1 = str.substr(0, 5);  std::cout << "Substring 1: " << substr1 << std::endl; // 输出: Substring 1: Hello  // 获取从索引7开始到字符串末尾的子串  std::string substr2 = str.substr(7);  std::cout << "Substring 2: " << substr2 << std::endl; // 输出: Substring 2: World!  // 获取整个字符串(不指定pos和count)  std::string substr3 = str.substr();  std::cout << "Substring 3: " << substr3 << std::endl; // 输出: Substring 3: Hello, World!  return 0;  
}

在这个例子中,substr1是从字符串str的开始位置提取的5个字符的子串,即"Hello"。substr2是从字符串str的第7个字符开始直到末尾的子串,即"World!"。而substr3由于没有指定pos和count参数,因此提取了整个字符串。

需要注意的是,如果pos参数超出了原字符串的范围(即大于或等于字符串的长度),或者pos + count超出了原字符串的范围,substr函数将抛出std::out_of_range异常(如果使用了范围检查的迭代器)。

总结

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

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

相关文章

Error: Cannot find module ‘@rollup/rollup-win32-x64-msvc‘

1.背景 新项目需要使用vite搭建一个v3项目,之前也弄过,但项目创建后却一直无法跑起来,大聪明的我一直没有注意到这个问题 2.解决步骤 方案1:删除node_modules和package-lock.json文件重新npm install下包,部分码农通过这个步骤可解决 方案2:node版本或者npm版本不对,或者没…

更新一条SQL的执行流程

在 MySQL中&#xff0c;条更新 SQL 语句执行的过程通常包括以下主要步骤: 1.客户端发送请求: 客户端应用程序(如数据库连接器或应用程序)构建一条 UPDATE SQL 语句&#xff0c;并将其发送到 MySOL 服务器端。 2.查询解析和优化: MySQL 服务器接收到请求后&#xff0c;先进行语法…

【软考】防火墙技术

目录 1. 概念2. 包过滤防火墙3. 应用代理网关防火墙4. 状态检测技术防火墙 1. 概念 1.防火墙(Firewall)是建立在内外网络边界上的过滤封锁机制&#xff0c;它认为内部网络是安全和可信赖的&#xff0c;而外部网络是不安全和不可信赖的。2.防火墙的作用是防止不希望的、未经授权…

Vue3:快速上手路由器

本人在B站上关于vue3的尚硅谷的课程&#xff0c;以下是整理一些笔记。 一.路由器和路由的概念 在 Vue 3 中&#xff0c;路由&#xff08;Router&#xff09;和路由器&#xff08;Router&#xff09;是两个相关但不同的概念。 1. 路由&#xff08;Router&#xff09;&#xff…

LeetCode.2908. 元素和最小的山形三元组 I

题目 2908. 元素和最小的山形三元组 I 分析 首先&#xff0c;看到这道题&#xff0c;第一反应就是暴力方法&#xff0c;三层for循环&#xff0c;枚举每一种情况&#xff0c;代码如下 class Solution {public int minimumSum(int[] nums) {int min Integer.MAX_VALUE;for(i…

SHELL(03)

SHELL(02) 中断控制 [ break ] 中断 跳出当前所在的循环体 , 执行循环体后的语句块可以结束整个循环 [ continue ] 继续 跳过循环体内余下的语句 , 重新判断条件以决定是否需要执行下一次循环结束当前循环 , 进入下次循环 [ exit ] 退出 退出脚本结束循环以及整个脚本 …

基于Springboot的学生选课系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的学生选课系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

线程池详解、核心参数、拒绝策略

什么是线程池 线程池是一种池化技术&#xff0c;它预先创建一组线程&#xff0c;用于执行异步任务。当有新任务到来时&#xff0c;线程池可以立即分配一个线程来处理&#xff0c;而不需要临时创建。这样可以减少因为频繁创建和销毁线程而导致的开销。 线程池的应用场景 高并…

2024年腾讯云4核8G12M轻量应用服务器测评_CPU内存带宽系统盘

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

laravel(源码笔记) request-response 执行过程

request capture SymfonyRequest::createFromGlobals() createRequestFromFactory如果是form提交的方式&#xff0c;则创建Symfony Package里提供的 ParameterBag对象包&#xff0c;处理请求。 createFromBase duplicate 克隆请求&#xff0c;并重设一些属性 response run…

什么是技术分析和EA技术?澳福一个提醒丰厚收益

技术分析是指根据炒外汇市场汇率走势的过去表现&#xff0c;借助技术分析工具预测汇率的未来趋势并确定入市、出市策略的预测分析方法。 它是以预测市场价格变化的未来趋势为目的&#xff0c;以市场行为(外汇市场的价格和交易量)的图形、图表、形态、指标为手段&#xff0c;使用…

docker通过已有镜像打包执行

1、查看已有镜像 docker images 2、制作dockerfile FROM python LABEL maintainer"JETZ" add . / WORKDIR /3、新建镜像 docker build -t python3.7.13 .4、打包导出镜像 docker save python3.7.13 -o /opt/python3.7.13.tar5、重新加载镜像 cd /opt docker l…

花钱的艺术:消费和投资如何分配

消费是钱花出去就回不来了。 消费分为可选消费和必需消费。 必需消费是必须花的钱&#xff0c;用一句老话&#xff0c;财米油盐酱醋茶&#xff0c;维持生活必需的支出。 可选消费&#xff0c;用来提升生活水平的支出&#xff0c;可花可不花&#xff0c;比如苹果手机&#xf…

电商系列之取消订单

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

SOA-面向服务架构

SOA-面向服务架构 1.概述2.SOA的设计原则包括&#xff1a;3. SOA实现方法1.Web Service2. 服务注册表3. 企业服务总线 细讲 超赞笔记 1.概述 SOA &#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;&#xff0c;从应用和原理的角度&#xff0c;目前有2种…

GET 与 POST(计算机网络)

GET &#xff1a;从服务器获取指定的资源。 POST &#xff1a;根据请求负荷&#xff08;报文body&#xff09;对指定的资源做出处理。 GET 和 POST 方法都是安全和幂等的吗&#xff1f; 在 HTTP 协议里安全和幂等的概念&#xff1a; 「安全」&#xff1a;请求方法不会「破坏」…

Matlab之提高交叉定位点的定位精度

通过测向交叉定位的方法&#xff0c;按理只需2根测向线即可得出定位点的位置。但由于误差的存在&#xff0c;求出的定位点位置存在一定的偏差。为了得到更加精确的定位点位置&#xff0c;需要对定位点进行冗余测量&#xff0c;从而得到多个定位点&#xff0c;然后通过定位点估计…

redis分布式锁-----基于Redis的SETNX命令的简单分布式锁实现

Redis的SETNX命令的简单分布式锁实现的Java示例 首先&#xff0c;确保你已经引入了Jedis这个Java Redis客户端库。你可以通过Maven或Gradle来添加依赖。 1、Maven依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifact…

Docker一键部署MySQL 8

Docker一键部署MySQL 8 脚本下载 下载路径&#xff1a;mysql8.0.20.sh 使用FTP 工具或rz 命令将脚本上传到服务器 授权 [rootxxx~]# chmod x mysql8.0.20.sh执行脚本 [rootiZm5e4qautzfi19sq8s7aeZ ~]# ./mysql8.0.20.sh 初始化MySQL部署... 拉取MySQL 8.0.20 镜像... 8.…

(一)认识微服务

1. 什么是微服务 微服务是分布式架构的一种。 1.1 微服务技术 &#xff01; Spring Cloud 分布式架构就是要把服务进行拆分&#xff0c;拆分的过程会产生一系列问题需要解决&#xff0c;而Spirng Cloud 只是解决了服务拆分的过程中的服务治理问题&#xff0c;所以一个完整的…