当前位置: 首页 > 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…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...