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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81557.shtml
英文地址,請注明出處:http://en.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;前端傳入選中的資源列表創…