C++20:玩转 string 的 starts_with 和 ends_with

文章目录

    • 一、背景与动机
    • 二、string::starts_with 和 string::ends_with
      • (一)语法与功能
      • (二)使用示例
        • 1\. 判断字符串开头
        • 2\. 判断字符串结尾
      • (三)优势
    • 三、string_view::starts_with 和 string_view::ends_with
      • (一)语法与功能
      • (二)使用示例
        • 1\. 判断字符串开头
        • 2\. 判断字符串结尾
      • (三)优势
    • 四、实践案例
      • (一)文件名处理
      • (二)HTTP 请求解析
    • 五、注意事项
    • 六、总结

在现代编程中,字符串操作是程序开发中不可或缺的一部分。C++20 标准的引入为字符串处理带来了诸多便捷功能,其中 std::stringstd::string_viewstarts_withends_with 方法尤为引人注目。这些方法不仅简化了代码,还提高了可读性和效率。本文将通过实际示例,深入探讨这些方法的使用场景和优势。

一、背景与动机

在 C++20 之前,判断一个字符串是否以某个特定的子串开头或结尾通常需要编写复杂的逻辑代码。例如,我们可能需要使用 std::string::substrstd::string::find 方法来实现类似功能,但这些方法不仅代码冗长,而且容易出错。C++20 的 starts_withends_with 方法正是为了解决这些问题而设计的。

二、string::starts_with 和 string::ends_with

(一)语法与功能

std::string::starts_withstd::string::ends_with 是 C++20 新增的成员函数,它们分别用于判断字符串是否以指定的字符或子串开头或结尾。其语法如下:

bool starts_with(char c) const noexcept;
bool starts_with(const char* s) const noexcept;
bool starts_with(const std::string& str) const noexcept;bool ends_with(char c) const noexcept;
bool ends_with(const char* s) const noexcept;
bool ends_with(const std::string& str) const noexcept;

这些方法支持多种参数类型,包括单个字符、C 风格字符串和 std::string 对象,为开发者提供了极大的灵活性。

(二)使用示例

1. 判断字符串开头
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";if (str.starts_with("Hello")) {std::cout << "The string starts with 'Hello'" << std::endl;}if (str.starts_with('H')) {std::cout << "The string starts with 'H'" << std::endl;}return 0;
}

输出结果为:

The string starts with 'Hello'
The string starts with 'H'
2. 判断字符串结尾
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";if (str.ends_with("!")) {std::cout << "The string ends with '!'" << std::endl;}if (str.ends_with("World!")) {std::cout << "The string ends with 'World!'" << std::endl;}return 0;
}

输出结果为:

The string ends with '!'
The string ends with 'World!'

(三)优势

  1. 简洁性:相比传统的字符串操作方法,starts_withends_with 提供了更简洁的语法,减少了代码量。
  2. 可读性:方法名称直观地表达了其功能,使得代码更易于理解和维护。
  3. 效率:这些方法经过优化,能够高效地处理字符串匹配操作。

三、string_view::starts_with 和 string_view::ends_with

(一)语法与功能

std::string_view 是 C++17 引入的轻量级字符串类,它提供了一种高效的方式处理字符串数据。C++20 为 std::string_view 添加了与 std::string 相同的 starts_withends_with 方法,其语法如下:

bool starts_with(char c) const noexcept;
bool starts_with(const char* s) const noexcept;
bool starts_with(const std::string_view& sv) const noexcept;bool ends_with(char c) const noexcept;
bool ends_with(const char* s) const noexcept;
bool ends_with(const std::string_view& sv) const noexcept;

这些方法与 std::string 的版本类似,但它们专门针对 std::string_view 设计,进一步提升了性能。

(二)使用示例

1. 判断字符串开头
#include <iostream>
#include <string_view>int main() {std::string_view sv = "Hello, World!";if (sv.starts_with("Hello")) {std::cout << "The string view starts with 'Hello'" << std::endl;}if (sv.starts_with('H')) {std::cout << "The string view starts with 'H'" << std::endl;}return 0;
}

输出结果为:

The string view starts with 'Hello'
The string view starts with 'H'
2. 判断字符串结尾
#include <iostream>
#include <string_view>int main() {std::string_view sv = "Hello, World!";if (sv.ends_with("!")) {std::cout << "The string view ends with '!'" << std::endl;}if (sv.ends_with("World!")) {std::cout << "The string view ends with 'World!'" << std::endl;}return 0;
}

输出结果为:

The string view ends with '!'
The string view ends with 'World!'

(三)优势

  1. 性能优势std::string_view 不会复制字符串数据,而是直接引用原始字符串。因此,在使用 starts_withends_with 方法时,不会产生额外的内存分配和复制开销。
  2. 灵活性std::string_view 可以与 std::string 无缝配合,使得代码更加灵活。

四、实践案例

(一)文件名处理

假设我们正在开发一个文件处理程序,需要判断文件名是否以特定的扩展名结尾。使用 ends_with 方法可以轻松实现这一功能:

#include <iostream>
#include <string>bool isImageFile(const std::string& filename) {return filename.ends_with(".jpg") || filename.ends_with(".png") || filename.ends_with(".gif");
}int main() {std::string filename = "example.jpg";if (isImageFile(filename)) {std::cout << filename << " is an image file." << std::endl;} else {std::cout << filename << " is not an image file." << std::endl;}return 0;
}

输出结果为:

example.jpg is an image file.

(二)HTTP 请求解析

在解析 HTTP 请求时,我们可能需要判断请求路径是否以特定的前缀开头。使用 starts_with 方法可以方便地实现这一功能:

#include <iostream>
#include <string>bool isApiRequest(const std::string& path) {return path.starts_with("/api/");
}int main() {std::string path = "/api/users";if (isApiRequest(path)) {std::cout << path << " is an API request." << std::endl;} else {std::cout << path << " is not an API request." << std::endl;}return 0;
}

输出结果为:

/api/users is an API request.

五、注意事项

  1. 空字符串处理:如果目标字符串为空,starts_withends_with 方法会返回 false
  2. 参数类型匹配:在使用 starts_withends_with 方法时,需要注意参数类型与目标字符串类型的一致性。例如,不要将 std::string 对象传递给 std::string_view 的方法。
  3. 性能优化:虽然 std::string_view 提供了更高的性能,但在某些场景下,可能需要将 std::string_view 转换为 std::string。此时需要注意内存分配和复制的开销。

六、总结

C++20 的 std::string::starts_withstd::string::ends_withstd::string_view::starts_withstd::string_view::ends_with 方法为字符串处理带来了极大的便利。它们不仅简化了代码,提高了可读性,还提升了性能。在实际开发中,合理使用这些方法可以显著提高开发效率和代码质量。希望本文的介绍和实践案例能够帮助你更好地理解和应用这些功能。

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

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

相关文章

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…

【MySQL】日志

目录 基本概念错误日志二进制日志查询日记慢查询日志 基本概念 日志&#xff08;Log&#xff09;是系统、软件或设备在运行过程中对发生的事件、操作或状态变化所做的记录。这些记录通常包含时间戳、事件类型、相关数据等信息&#xff0c;用于跟踪运行过程、排查故障、审计操作…

ArkUI-List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用&#xff0c;条件渲染&#xff0c;循环渲染&#xff0c;懒加载等渲染控制方式生成子组件…

Word限定仅搜索中文或英文引号

在Word中&#xff0c;按下CtrlF键&#xff0c;左侧会弹出导航搜索栏&#xff1b; 点击放大镜旁边的下拉栏&#xff0c;选择高级查找 在查找内容处输入英文状态下的"&#xff0c;然后选择更多->使用通配符&#xff0c;就可以仅查找英文状态下的" 同理&#xff…

智能飞鸟监测 守护高压线安全

飞鸟检测新纪元&#xff1a;视觉分析技术的革新应用 在现代化社会中&#xff0c;飞鸟检测成为了多个领域不可忽视的重要环节。无论是高压线下的安全监测、工厂内的生产秩序维护&#xff0c;还是农业区的作物保护&#xff0c;飞鸟检测都扮演着至关重要的角色。传统的人工检测方…

React初学分享 事件绑定 组价通信 useState useEffect

React初学 React介绍快速搭建React项目JSXJSX的本质优势&#xff1a;JSX中使用JS表达式JSX中的列表渲染JSX实现简单条件渲染JSX实现复杂条件渲染 React中的事件绑定React基础事件绑定传递自定义参数同时传递事件对象和自定义参数 React中的组件useState修改状态的规则状态不可变…

【实战】deepseek数据分类用户评论数据

在平时的工作中&#xff0c;我们会遇到数据分类的情况&#xff0c;比如将一些文本划分为各个标签。如果人工分类这块的工作量将是非常大&#xff0c;而且分类数据的准确性也不高。我们需要用到一些工具来实现。提高效率的同时也提高准确率。 1.示例数据 用户ID 时间戳 评论场…

git tag以及git

git tag 以及git 一、先说收获吧 1. git bash 在windows上 类似于linux的bash提供的shell命令行窗口&#xff0c;可以执行很多linux命令&#xff0c;cd pwd ls vim cat touch mkdir&#xff0c;还可以用正则匹配查看标签。相当于在windows上装了一个小的linux。git init myproj…

[动手学习深度学习]28. 批量归一化

当前所有的深度学习网络&#xff0c;或多或少都用了批归一化操作 批归一化的思想不新&#xff0c;但是这个特定的层是16年左右出现的&#xff0c;在这之后&#xff0c;发现他对深度学习算法性能的提升非常有效 概念理解 这是一个网络的结构&#xff1a; 当数据很深的时候&am…

AI比人脑更强,因为被植入思维模型【17】万物联系思维模型

万物联系,万物,并不孤立。 定义 万物联系思维模型是一种强调世界上所有事物都相互关联、相互影响的思维方式。它认为任何事物都不是孤立存在的,而是与周围的环境、其他事物以及整个宇宙构成一个有机的整体。这种联系不仅包括直接的因果关系,还涵盖了间接的、潜在的、动态的…

昆仑技术重构AI大模型落地范式,长期作“加法”迎来国产生态化“拐点”

作者 | 曾响铃 文 | 响铃说 DeepSeek的爆火&#xff0c;在业内迅速掀起了一场国产化的变革。“国产大模型国产算力”软硬协同的范式正在被重构&#xff0c;AI产业国产化的含金量持续提升&#xff0c;越来越多的企业在这一趋势下加速走上数智化转型路径。 其中&#xff0c;以…

【C++初阶】---类和对象(上)

1.类的定义 1.1类的定义格式 • class为定义类的关键字&#xff0c;Data为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。 •…

常见中间件漏洞(tomcat)

CVE-2017-12615 当在Tomcat的conf&#xff08;配置目录下&#xff09;/web.xml配置文件中添加readonly设置为false时&#xff0c;将导致该漏洞产生&#xff0c;&#xff08;需要允许put请求&#xff09; , 攻击者可以利用PUT方法通过精心构造的数据包向存在漏洞的服务器里面上传…

NSSCTF(MISC)——[NSSRound#4 SWPU]Type Message

相应的做题地址&#xff1a;https://www.nssctf.cn/problem/2478 得到4个wav文件 使用DTMF Decoder工具&#xff0c;对D.wav进行识别 随波逐流&#xff0c;发现九宫格键盘解码能够得到flag 对其他3个文件依次进行识别解码 最终得到fNSSCTF{DTMFISREALLYEASY}

C++核心语法快速整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要为学过多门语言玩家快速入门C 没有基础的就放弃吧。 全部都是精华&#xff0c;看完能直接上手改别人的项目。 输出内容 std::代表了这里的cout使用的标准库&#xff0c;避免不同库中的相同命名导致混乱 …

Matplotlib完全指南:数据可视化从入门到实战

目录 引言 一、环境配置与基础概念 1.1 安装Matplotlib 1.2 导入惯例 1.3 两种绘图模式 二、基础图形绘制 2.1 折线图&#xff08;Line Plot&#xff09; 2.2 柱状图&#xff08;Bar Chart&#xff09; 三、高级图表类型 3.1 散点图&#xff08;Scatter Plot&#xff…

C++:IO库

一、C IO库的架构 C标准库中的IO系统基于流&#xff08;Stream&#xff09;​的概念&#xff0c;分为三层结构&#xff1a; ​流对象​&#xff08;如cin, cout, fstream&#xff09;​流缓冲区​&#xff08;streambuf&#xff0c;负责底层数据处理&#xff09;​数据源/目的…

【STM32】SPI通信外设硬件SPI读写W25Q64

【STM32】SPI通信协议&W25Q64Flash存储器芯片&#xff08;学习笔记&#xff09;-CSDN博客 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担可配置8位/16位数据帧、高位先行/…

二叉树之树的高以及遍历

二叉树的高其实很简单就一句话&#xff1a; 从根节点到叶节点的最长路径中的边数就是二叉树的高 int FindHeight(Btree root){int leftheight;int rightheight;if(rootNULL){return -1;}else{leftheightFindHeight(root->left );rightheightFindHeight(root->right );}r…

DeepSeek技术架构解析:MoE混合专家模型

一、前言 2025年初&#xff0c;DeepSeek V3以557万美元的研发成本&#xff08;仅为GPT-4的1/14&#xff09;和开源模型第一的排名&#xff0c;在全球AI领域掀起波澜。其核心创新之一——混合专家模型&#xff08;Mixture of Experts, MoE&#xff09;的优化设计&#xff0c;不…