C++字符串处理:`std::string`和`std::string_view`的区别与使用

在 C++中,std::stringstd::string_view都用于处理字符串,但它们的用途和性能特点有很大不同。本教程将通过代码示例和流程图,帮助你快速掌握它们的使用方法。

1.什么是std::stringstd::string_view

1.1std::string

std::string是一个动态字符串类,用于存储和管理可变长度的字符串数据。它提供了丰富的操作接口,如拼接、查找、替换等。

• 特点:

• 动态分配内存,可以动态调整大小。

• 提供丰富的字符串操作方法。

• 适合需要频繁修改字符串的场景。

1.2std::string_view

std::string_view是一个非拥有型的字符串视图,它不拥有字符串数据的所有权,而是指向一个已存在的字符串数据。它主要用于高效地传递和处理字符串片段,而不涉及字符串的动态分配或复制。

• 特点:

• 不分配内存,只是对已有字符串的视图。

• 性能高,适合只读操作。

• 适合传递字符串片段,避免不必要的拷贝。

2.使用std::stringstd::string_view

2.1 创建字符串

#include <iostream>
#include <string>
#include <string_view>int main() {// 创建 std::stringstd::string str = "Hello, World!";std::cout << "std::string: " << str << std::endl;// 创建 std::string_viewstd::string_view sv = str; // 从 std::string 创建std::string_view sv2 = "C-style string"; // 从 C 风格字符串创建std::cout << "std::string_view: " << sv << std::endl;std::cout << "std::string_view from C-string: " << sv2 << std::endl;return 0;
}

输出

std::string: Hello, World!
std::string_view: Hello, World!
std::string_view from C-string: C-style string

2.2 字符串拼接

std::string_view本身不支持动态拼接,但可以与std::string配合使用。

#include <iostream>
#include <string>
#include <string_view>int main() {std::string_view sv = "Hello, ";std::string result = sv + "World!"; // 将 std::string_view 转换为 std::string 并拼接std::cout << "Concatenated result: " << result << std::endl;return 0;
}

输出

Concatenated result: Hello, World!

2.3 高效拼接

如果需要频繁拼接字符串,建议使用std::stringappend方法或std::ostringstream

#include <iostream>
#include <string>
#include <sstream>int main() {std::string str1 = "Hello, ";std::string str2 = "World!";std::string result;// 使用 std::string 的 append 方法result.append(str1);result.append(str2);std::cout << "Concatenated result: " << result << std::endl;// 使用 std::ostringstreamstd::ostringstream oss;oss << str1 << str2;std::string result2 = oss.str();std::cout << "Concatenated result (ostringstream): " << result2 << std::endl;return 0;
}

输出

Concatenated result: Hello, World!
Concatenated result (ostringstream): Hello, World!

3.使用场景

std::string:适用于需要动态修改字符串内容的场景。

std::string_view:适用于只读操作,尤其是需要高效传递字符串片段的场景。

4.流程图

以下是使用std::stringstd::string_view的流程图,帮助你更好地理解。

开始
选择字符串类型
需要动态修改字符串内容?
使用 std::string
使用 std::string_view
进行字符串操作
进行只读操作
结束

4.1 流程图解释

• 选择字符串类型:

• 如果需要动态修改字符串内容,选择std::string

• 如果只需要只读操作,选择std::string_view

• 使用std::string

• 提供丰富的操作接口,如拼接、查找、替换等。

• 使用std::string_view

• 主要用于高效传递和处理字符串片段,不涉及动态分配或复制。

5.总结

std::string:动态字符串类,适合需要频繁修改字符串的场景。

std::string_view:非拥有型字符串视图,适合只读操作,性能高效。

• 拼接操作:使用std::string进行拼接,std::string_view可以作为输入。

6.注意事项

std::string_view的生命周期:

• 在使用std::string_view时,必须确保底层字符串数据在std::string_view使用期间保持有效。如果底层字符串被销毁或修改,std::string_view的行为将是未定义的。

• 性能优化:

• 如果拼接操作非常频繁,建议使用std::stringreserve方法预先分配足够的内存,以减少动态内存分配的开销。

• 例如:

    std::string result;result.reserve(str1.size() + str2.size());result.append(str1);result.append(str2);```

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

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

相关文章

Pod 节点数量

动态调整 在 Kubernetes 中&#xff0c;如果为量化交易系统的 Pod 设置了可伸缩&#xff08;HPA / VPA / 自定义控制器&#xff09;&#xff0c;并且默认副本数是 5&#xff0c;那么节点数量&#xff08;副本数&#xff09;是否变化&#xff0c;主要取决于以下几个因素。 ✅ …

基于OpenCV中的图像拼接方法详解

文章目录 引言一、图像拼接的基本流程二、代码实现详解1. 准备工作2. 特征检测与描述detectAndDescribe 函数详解&#xff08;1&#xff09;函数功能&#xff08;2&#xff09;代码解析&#xff08;3&#xff09;为什么需要这个函数&#xff1f;&#xff08;4&#xff09;输出数…

Java-List集合类全面解析

Java-List集合类全面解析 前言一、List接口概述与核心特性1.1 List在集合框架中的位置1.2 List的核心特性1.3 常见实现类对比 二、ArrayList源码剖析与应用场景2.1 内部结构与初始化2.2 动态扩容机制2.3 性能特点与最佳实践 三、LinkedList 源码剖析与应用场景3.1 内部结构与节…

Flink 并行度的设置

在 Apache Flink 中&#xff0c;并行度&#xff08;Parallelism&#xff09; 是控制任务并发执行的核心参数之一。Flink 提供了 多个层级设置并行度的方式&#xff0c;优先级从高到低如下&#xff1a; &#x1f9e9; 一、Flink 并行度的四个设置层级 层级描述设置方式Operator…

OpenCV 笔记(39):频域中的拉普拉斯算子

1. 拉普拉斯算子 在该系列的第八篇文章中&#xff0c;我们曾经介绍过在二维空间拉普拉斯算子的定义为&#xff1a; 这是对函数 的二阶偏导数之和。 2. 拉普拉斯算子的傅里叶变换及其推导 在该系列的第三十二篇文章中&#xff0c;我们曾给介绍过下面的公式 二维连续傅里叶变换&…

入职软件开发与实施工程师了后........

时隔几个月没有创作的我又回来了&#xff0c;这几个月很忙&#xff0c;我一直在找工作&#xff0c;在自考&#xff08;顺便还处理了一下分手的事&#xff09;&#xff0c;到处奔波&#xff0c;心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生&#xff0c;做我不愿意做的普通…

多卡跑ollama run deepseek-r1

# 设置环境变量并启动模型 export CUDA_VISIBLE_DEVICES0,1,2,3 export OLLAMA_SCHED_SPREAD1 # 启用多卡负载均衡 ollama run deepseek-r1:32b 若 deepseek-r1:32b 的显存需求未超过单卡容量&#xff08;如单卡 24GB&#xff09;&#xff0c;Ollama 不会自动启用多卡 在run…

09、底层注解-@Import导入组件

09、底层注解-Import导入组件 Import是Spring框架中的一个注解&#xff0c;用于将组件导入到Spring的应用上下文中。以下是Import注解的详细介绍&#xff1a; #### 基本用法 - **导入配置类** java Configuration public class MainConfig { // 配置内容 } Configuration Impo…

题解:P12207 [蓝桥杯 2023 国 Python B] 划分

链接 题目描述 给定 40 个数&#xff0c;请将其任意划分成两组&#xff0c;每组至少一个元素。每组的权值为组内所有元素的和。划分的权值为两组权值的乘积。请问对于以下 40 个数&#xff0c;划分的权值最大为多少。 5160 9191 6410 4657 7492 1531 8854 1253 4520 9231126…

配置ssh服务-ubuntu到Windows拷贝文件方法

背景&#xff1a; 在工作中&#xff0c;需要频繁从ubuntu到Windows拷贝文件&#xff0c;但有时间总是无法拷出&#xff0c;每次重启虚拟机又比较麻烦并且效率较低。可以使用scp服务进行拷贝&#xff0c;不仅稳定而且高效&#xff0c;现将配置过程进行梳理&#xff0c;以供大家参…

线程池模式与C#中用法

一、线程池模式解析 1. 核心概念 线程池是一种 管理线程生命周期的技术&#xff0c;主要解决以下问题&#xff1a; 减少线程创建/销毁开销&#xff1a;复用已存在的线程 控制并发度&#xff1a;避免无限制创建线程导致资源耗尽 任务队列&#xff1a;有序处理异步请求 2. …

设置IDEA打开新项目使用JDK17

由于最近在学习Spring-AI&#xff0c;所以JDK8已经不适用了&#xff0c;但是每次创建新项目都还是JDK8&#xff0c;每次调来调去很麻烦 把Projects和SDKs都调整为JDK17即可 同时&#xff0c;Maven也要做些更改&#xff0c;主要是添加build标签 <build><plugins>&…

初识MySQL · 索引

目录 前言&#xff1a; 重温磁盘 认识索引 为什么这么做&#xff0c;怎么做 重谈page 聚簇索引VS非聚簇索引 回表查询 索引分类 前言&#xff1a; 前文我们主要是介绍了MySQL的一些基本操作&#xff0c;增删查改一类的操作都介绍了&#xff0c;并且因为大多数情况下&am…

MySQL——7、复合查询和表的内外连接

复合查询和表的内外连接 1、基本查询回顾2、多表查询3、自连接4、子查询4.1、单行子查询4.2、多行子查询4.3、多列子查询4.4、在from子句中使用子查询4.5、合并查询 5、表的内连和外连5.1、内连接5.2、外连接5.2.1、左外连接5.2.2、右外连接 1、基本查询回顾 1.1、查询工资高于…

MYSQL故障排查和环境优化

一、MySQL故障排查 1. 单实例常见故障 &#xff08;1&#xff09;连接失败类问题 ERROR 2002 (HY000): Cant connect to MySQL server 原因&#xff1a;MySQL未启动或端口被防火墙拦截。 解决&#xff1a;启动MySQL服务&#xff08;systemctl start mysqld&#xff09;或开放…

7GB显存如何部署bf16精度的DeepSeek-R1 70B大模型?

构建RAG混合开发---PythonAIJavaEEVue.js前端的实践-CSDN博客 服务容错治理框架resilience4j&sentinel基础应用---微服务的限流/熔断/降级解决方案-CSDN博客 conda管理python环境-CSDN博客 快速搭建对象存储服务 - Minio&#xff0c;并解决临时地址暴露ip、短链接请求改…

数字图像处理——图像压缩

背景 图像压缩是一种减少图像文件大小的技术&#xff0c;旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用&#xff0c;图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。 技术总览 当下图像压缩JPEG几乎一统天下&#xff…

抖音视频怎么去掉抖音号水印

你是不是经常遇到这样的烦恼&#xff1f;看到喜欢的抖音视频&#xff0c;想保存下来分享给朋友或二次创作&#xff0c;却被抖音号水印挡住了画面&#xff1f;别着急&#xff0c;今天教你几种超简单的方法&#xff0c;轻松去除水印&#xff0c;高清无水印视频一键保存&#xff0…

RISC-V 开发板 MUSE Pi Pro PCIE 测试以及 fio 崩溃问题解决

视频讲解&#xff1a; RISC-V 开发板 MUSE Pi Pro PCIE 测试以及 fio 崩溃问题解决 板子上有一个m.2的pcie插槽&#xff0c;k1有三个pcie控制器&#xff0c;pcie0和usb3复用一个phy&#xff0c;所以实际开发板就两个&#xff0c;测试的话&#xff0c;上一个nvme硬盘&#xff0c…

超级管理员租户资源初始化与授权管理设计方案

背景说明 在多租户系统中&#xff0c;资源&#xff08;如功能模块、系统菜单、服务能力等&#xff09;需按租户维度进行授权管理。超级管理员在创建新租户时&#xff0c;需要初始化该租户的资源授权信息。 两种可选方案 方案描述方案 A&#xff1a;前端传入选中的资源列表创…