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

【c++篇】:从基础到实践--c++内存管理技巧与模版编程基础

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.c/c内存分布二.c/c的动态内存管理方式2.1.c语言的动态内存管…...

如何减小 Maven 项目生成的 JAR 包体积 提升运维效率

在使用 Maven 构建 Java 项目时&#xff0c;有时需要减小生成的 JAR 包的体积&#xff0c;以提高部署效率或减少资源消耗。以下是一些有效的方法来减小 JAR 包的体积&#xff1a; 排除不必要的依赖打包时&#xff0c;依赖jar包独立于应用jar包 1. 排除不必要的依赖 通过排除项目…...

Python自动化会议记录与摘要生成

前言 在现代工作环境中&#xff0c;会议是团队沟通和决策的重要方式。然而&#xff0c;整理会议记录和生成摘要往往是一项耗时且容易出错的任务。幸运的是&#xff0c;借助Python编程语言以及一些强大的库&#xff0c;我们可以自动化这一过程&#xff0c;让机器帮助我们完成这…...

SwiftUI 中 List 或 Form 子视图关联的 swipeAction 导致展开动画异常的解决

问题现象 小伙伴们都知道,在 SwiftUI 中更快捷的增强 List 或 Form 子视图(Cell)交互功能的方法是使用 swipeAction 修改器。不过,对其使用稍有不慎也会横生枝节。 如上图所示,不适当的设置 Cell 视图布局会使 swipeAction 无法生成正确的收缩和展开动画。对此我们有什么…...

Apache Paimon Catalog

Paimon Catalog可以持久化元数据&#xff0c;当前支持两种类型的metastore&#xff1a; 文件系统&#xff08;默认&#xff09;&#xff1a;将元数据和表文件存储在文件系统中。hive&#xff1a;在 hive metastore中存储元数据。用户可以直接从 Hive 访问表。 2.2.1 文件系统…...

C++基础:三个字符串也能搞大小?

上一篇说了三个整数比较大小&#xff0c;按照顺序输入的&#xff0c;这次我们看看字符串的&#xff0c;顺便把那个简化以下&#xff1a; 题目:这次输入三个字符串。如果用户输入“Stenbeck", “Hemingway”,“Fitzgerald”,输出将是“Fitzgerald&#xff0c;Hemingway&…...

了解AIGC——自然语言处理与生成

AIGC——自然语言处理与生成&#xff1a;揭秘AI如何生成语言 近年来&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;技术迅猛发展&#xff0c;自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;与生成技术的结合&#xff0c;使得机器不仅…...

Modern CMake 简明教程(8)- 集成Qt

在项目中集成 Qt 库需要先使用 find_package 查找 Qt 的安装位置。对于 Qt4, CMake 使用 Module 模式进行查找(FindQt4.cmake 由 CMake 提供),而 对于 Qt5、Qt6,则是使用 Config 模式进行查找,相应的 config 文件位于类似下面的目录中 D:\Qt\5.15.2\msvc2019\lib\cmake。…...

人脸应用实例:性别年龄预测

在当今科技飞速发展的时代&#xff0c;人脸识别技术已经从科幻电影走进了我们的日常生活。通过算法来识别人脸的特征&#xff0c;进而判断身份、年龄和性别&#xff0c;这一技术正逐步改变着我们的生活方式。今天&#xff0c;我们就来探讨一下基于深度学习的人脸应用实例——性…...

学习threejs,通过THREE.Raycaster给模型绑定点击事件

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Raycaster光线投射概…...

花的网站建设规划书/百度推广多少钱一天

作者部门&#xff1a;数字地球重点实验室近日&#xff0c;中科院空天信息研究院数字地球重点实验室王超研究员团队首次公开了合成孔径雷达(SAR)图像船舶检测数据集。该数据集来自于多源、多模式SAR图像。基于此数据集&#xff0c;该团队实现了复杂背景下的商船检测与分类一体化…...

企业管理咨询网站模板/中国互联网协会官网

目录 公共文件 引入 拦截器 请求 验证码实例 后端接口 前端 跨域 公共文件 文件路径和名称&#xff1a;utils/api.js 引入 import axios from "axios"; import { Message } from element-ui; import router from "../router";//在拦截器中引入了ro…...

哪里有做网站公司/seo怎么学

爱情没有如果很多人喜欢给爱情做假设。 他说&#xff0c;如果你可以温柔点&#xff0c;我可以更爱你&#xff0c;不会轻易放弃你。 她说&#xff0c;如果你可以体贴点&#xff0c;我可以更珍惜你&#xff0c;我也不会离开你。 但&#xff0c;终究在一个时间的定格中交错走开。 …...

网站链接跳转怎么做/百度最容易收录的网站

后面对于内存方面的优化一直没有补充到上面的那篇文章里&#xff0c;等有空了&#xff0c;补上后续的一些内存优化手段&#xff0c;供交流分享。 3.Google近年来对Jetpack进行不断的补充和完善&#xff0c;我也对Jetpack进行一定的学习和引进&#xff0c;特别是lifecycle组件等…...

贵阳网站建设制作/营销软文范例大全100

C语言常用宏定义技巧用C语言编程&#xff0c;宏定义是个很重要的编程技巧。用好了宏定义&#xff0c;它可以增强程序的可读性、可移植性、方便性、灵活性等等。 1. 防止一个头文件被重复包含&#xff1a; #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 当你所建的工程…...

网站二级页怎么做/新的数据新闻

https://blog.csdn.net/sun1021873926/article/details/78002118 115道Java经典面试题&#xff08;面中率最高、最全&#xff09; 史上最全 40 道 Dubbo 面试题及答案 给初中级JAVA准备的面试题 为什么说Redis是单线程的&#xff1f; Redis为什么是单线程 mysql数据库引擎常用面…...