当前位置: 首页 > news >正文

「C/C++」C++17 之 std::string_view 轻量级字符串视图

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

    • std::string_view:C++17中的轻量级字符串视图
      • 一、std::string_view的基本特性
      • 二、std::string_view的常用操作
      • 三、std::string_view与std::string的比较
      • 四、注意事项
      • 五、示例代码
      • 结语

std::string_view:C++17中的轻量级字符串视图

C++17引入了一种新的字符串处理工具——std::string_view。std::string_view提供了一种轻量级、非拥有的字符串视图,使得对字符串的操作更加灵活和高效。本文将详细介绍std::string_view的特性和用法,以及它与std::string的区别和使用场景。

一、std::string_view的基本特性

  1. 非拥有性(Non-Owning)
    std::string_view不拥有字符串的内存,它仅仅是对现有字符串的引用。这意味着它不负责字符串的生命周期管理,使用者需要确保在std::string_view使用期间底层数据保持不变和有效。

  2. 轻量级
    std::string_view对象本身非常轻量,通常只包含一个指向字符串的指针和一个长度。因此,它适合于函数参数、返回值以及临时字符串的处理,可以减少内存分配和复制的开销。

  3. 零终止符
    与std::string不同,std::string_view不要求字符串以零终止符结尾。因此,它可以表示任意二进制数据,这使得它在处理非文本数据时更加灵活。

  4. 不可变性
    std::string_view中的数据是不可变的,无法通过视图修改原始字符串。这保证了数据的一致性和安全性。

  5. 迭代器兼容
    std::string_view支持与std::string兼容的迭代器接口,可以方便地使用标准库算法进行处理。

二、std::string_view的常用操作

  1. 构造
    std::string_view可以从std::string、C风格字符串(const char*)或字符数组构造。例如:

    std::string str = "Hello, World!";
    std::string_view sv1(str);
    const char* cstr = "Hello, C++!";
    std::string_view sv2(cstr);
    
  2. 子串操作
    std::string_view的substr方法用于获取指定范围内的子字符串视图,而不会引起额外的内存分配。例如:

    std::string_view sv = "Hello, C++!";
    std::string_view sub_sv = sv.substr(0, 5); // 获取 "Hello"
    
  3. 访问元素和比较
    std::string_view可以通过下标操作符访问元素,也可以与其他std::string_view或字符串进行比较。例如:

    char first_char = sv[0]; // 访问第一个字符
    if (sv == "Hello") { // 比较// 相等
    }
    
  4. 长度
    std::string_view的length方法用于获取字符串的长度。例如:

    std::size_t len = sv.length(); // 获取字符串的长度
    

三、std::string_view与std::string的比较

  1. 使用场景

    • std::string_view提供了一种轻量级、高效的字符串处理方式,特别适用于那些只需要读取字符串而不需要修改或拥有其拷贝的场景。
    • 在需要修改字符串内容或拥有字符串副本的情况下,仍然应该使用std::string类型。
  2. 性能

    • 传统的std::string在传递和处理时通常会复制数据,而std::string_view仅仅是一个对已有字符串的引用,避免了数据的复制和重新分配,提高了性能。
  3. 灵活性

    • std::string_view可以直接从std::string或C风格字符串创建,并且使用起来十分灵活。它支持与std::string兼容的迭代器接口和标准库算法,使得代码更加简洁和可读。

四、注意事项

  • 使用std::string_view时需要确保原始字符串的生命周期足够长,以避免悬挂引用的问题。
  • std::string_view不提供修改其所指向数据的方法,它仅仅是提供了对数据的只读访问。如果需要修改字符串,应该使用std::string或其他可变的字符串类型。

五、示例代码

#include <iostream>
#include <string_view>void printStringView(std::string_view sv) {std::cout << "String View: " << sv << std::endl;std::cout << "Length: " << sv.size() << std::endl;
}int main() {std::string str = "Hello, World!";std::string_view sv(str);printStringView(sv);std::string_view sub_sv = sv.substr(7);printStringView(sub_sv);return 0;
}

在上述示例中,我们首先创建了一个std::string对象str,然后创建了一个std::string_view对象sv,并将str作为其构造函数的参数。我们通过将sv传递给printStringView函数来打印sv表示的字符串。同时,我们还展示了如何使用std::string_view::substr函数从std::string_view中获取子字符串,并将其再次传递给printStringView函数以打印子字符串。

结语

std::string_view是C++17中引入的一种轻量级字符串视图类型,它提供了一种非常高效的方式来引用和操作现有的字符串(或字符数组)而不需要复制数据。通过使用std::string_view,可以减少内存分配和复制的开销,提高程序的性能。然而,使用std::string_view时需要注意原始字符串的生命周期管理,以避免悬挂引用的问题。希望本文能够帮助读者理解std::string_view的特性和用法,并在实际编程中灵活运用它。


在这里插入图片描述

相关文章:

「C/C++」C++17 之 std::string_view 轻量级字符串视图

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

Linux内核-内核模块内核参数

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们的Linux进阶部分&#xff0c;到目前为止&#xff0c;已经讲过&#xff1a;硬件&#xff0c;日常运维&#xff0c;基础软…...

中电信翼康工程师:我在 Apache SeaTunnel 社区的贡献之旅

贡献者Github ID&#xff1a;luckyLJY 文章整理&#xff1a;曾辉 Apache SeaTunnel 作为一款强大的数据同步和转换工具&#xff0c;凭借其部署易用性、容错机制、数据源支持、性能优势、功能丰富性以及活跃的社区支持&#xff0c;成为了数据工程师们不可或缺的利器。 因其具有的…...

【ESP32S3】VSCode 开发环境搭建

ESP32S3 有多种开发方式&#xff0c;主流的有 Eclipse 和 VSCode 两种。本文来介绍一下基于 VSCode 的开发环境搭建。 VSCode 环境需要依赖于 ESP-IDF 插件&#xff0c;因此需要在 VSCode 插件市场中搜索并安装 ESP-IDF 插件&#xff1a; 安装完成后侧边栏会多出一个 ESP-IDF …...

大模型,多模态大模型面试问题基础记录24/10/24

大模型&#xff0c;多模态大模型面试问题基础记录24/10/24 问题一&#xff1a;LoRA是用在节省资源的场景下&#xff0c;那么LoRA具体是节省了内存带宽还是显存呢&#xff1f;问题二&#xff1a;假如用pytorch完成一个分类任务&#xff0c;那么具体的流程是怎么样的&#xff1f;…...

使用TimeShift备份和恢复Ubuntu Linux

您是否曾经想过如何备份和恢复您的Ubuntu或Debian系统&#xff1f;TimeShift是一个强大的备份和还原工具。TimeShift允许您创建系统快照&#xff0c;提供了一种在出现意外问题或系统故障时恢复到先前状态的简便方式。您可以使用RSYNC或BTRFS创建快照。 有了这个介绍&#xff0…...

win7现在还能用吗_哪些配置的电脑还可以安装win7系统

2024年了都&#xff0c;win7现在还能用吗&#xff1f;答案是肯定的。那么哪些配置的电脑还可以安装win7系统呢&#xff1f;下面就针对这两个问题详细分区。 win7现在还能用吗&#xff1f; Windows 7系统虽然已经停止官方支持&#xff0c;但仍然可以使用。以下是关于Windows 7系…...

基于GPT的智能客服落地实践

&#x1f4cd;前言 在日常生活中&#xff0c;「客服」这个角色几乎贯穿着我们生活的方方面面。比如&#xff0c;淘宝买东西时&#xff0c;需要客服帮你解答疑惑。快递丢失时&#xff0c;需要客服帮忙找回。报名参加培训课程时&#xff0c;需要客服帮忙解答更适合的课程…… 基…...

Sourcetree和GitLab的结合使用

一、写在前面 为什么是Sourcetree和GitLab&#xff1f;因为遇到的坑最少&#xff0c;在不用梯子的情况下&#xff0c;推送速度还可以。 这篇文章主要介绍的是&#xff0c;怎么把自己写的代码文件打包放到GitLab上去&#xff0c;方便别人下载使用&#xff0c;也方便自己在另一…...

双十一开启极速达夜派;黑神话获泰国年度最佳游戏;AI 模型可帮助识别 17000 多种疾病的候选药物....| 网易数智日报

双 11 菜鸟在北京、上海、广州、杭州等城市开启「预售极速达夜派」服务 10 月 21 日&#xff0c;菜鸟在北京、上海、广州、杭州等城市开启「预售极速达夜派」服务&#xff0c;批量大促包裹实现小时级送达。 据介绍&#xff0c;在消费者支付尾款前&#xff0c;菜鸟供应链就已经…...

深入理解JAVA虚拟机(一)

介绍JAVA虚拟机的运行时数据区域 按照物理结构来划分&#xff1a;java虚拟机主要由以下几部分构成栈、堆和程序计数器&#xff0c;其中栈又可以分为虚拟机栈VM stack 和 本地方法栈 Native Method Statck&#xff0c;堆可以划分方法区和普通的堆内存。按照逻辑划分线程私有空间…...

从Excel文件中读取数据

笔记 import openpyxl # 打开工作簿 workbookopenpyxl.load_workbook(景区天气.xlsx) # 选择要操作的工作表 sheetworkbook[景区天气] # 表格数据是二维列表&#xff0c;先遍历的是行&#xff0c;后遍历的是列 lst[] # 存储的是行数据 for row in sheet.rows:sublst[] # 存储单…...

深入剖析MySQL的索引机制及其选型

在数据库管理系统中&#xff0c;索引是一种重要的优化工具&#xff0c;用于加速数据的检索和查询处理。在MySQL中&#xff0c;合理使用索引可以显著提高数据库的性能。本文将深入探讨MySQL的索引机制&#xff0c;包括不同类型索引的优势、劣势及在实际使用中的选型策略。 1. 什…...

校园表白墙源码修复版

此校园表白墙源码基于thinkphp&#xff0c;因为时代久远有不少bug&#xff0c;经本人修复已去除大部分bug&#xff0c;添加了美化元素。 https://pan.quark.cn/s/1f9b3564c84b https://pan.baidu.com/s/1bb9vu9VV2jJoo9-GF6W3xw?pwd7293 https://caiyun.139.com/m/i?2hoTc…...

Android 内存优化——常见内存泄露及优化方案

看到了一篇关于内存泄漏的文章后&#xff0c;就想着分享给大家&#xff0c;最后一起学习&#xff0c;一起进步&#xff1a; 如果一个无用对象&#xff08;不需要再使用的对象&#xff09;仍然被其他对象持有引用&#xff0c;造成该对象无法被系统回收&#xff0c;以致该对象在…...

Qt6.7.2中使用OpenSSL的坑

最近编写Qt Quick项目&#xff0c;使用Qt6.7.2版本&#xff0c;CMAKE编译&#xff0c;开始QtCreator运行代码都没有问题&#xff0c;访问https也正常&#xff0c;但打出安装包后一试&#xff0c;发现https访问不了&#xff0c;尴尬&#xff01;&#xff01; 查看了相关日志发现…...

Mybatis-08.基础操作-删除

一.删除 接口方法 package com.gjw.mapper;import com.gjw.pojo.Emp; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper;import java.util.List;Mapper public interface EmpMapper {// 根据ID删除数据Delete("delete from e…...

通过FDM升级Firepower

1.基本说明 本文主要主要介绍如何通过FDM来升级Firepower设备&#xff0c;这里以FPR1010设备为例&#xff0c;那么什么事Firepower、FDM呢&#xff1f;在开始之前&#xff0c;进行简单的介绍。 Firepower&#xff1a;思科 Firepower 是网络安全和流量管理产品的集成套件&…...

使用 Kibana 将地理空间数据导入 Elasticsearch 以供 ES|QL 使用

作者&#xff1a;来自 Elastic Craig Taverner 如何使用 Kibana 和 csv 采集处理器将地理空间数据采集到 Elasticsearch 中&#xff0c;以便在 Elasticsearch 查询语言 (ES|QL) 中进行搜索。Elasticsearch 具有强大的地理空间搜索功能&#xff0c;现在 ES|QL 也具备这些功能&am…...

demo说明

代码说明 MDIO总线的注册和初始化&#xff1a;分配并注册MDIO总线&#xff0c;用于与PHY设备通信。 网络设备的创建&#xff1a;分配网络设备&#xff08;如以太网接口&#xff09;。 PHY设备连接&#xff1a;通过phy_connect函数连接PHY设备&#xff0c;指定回调函数my_adj…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...