C++20:玩轉 string 的 starts_with 和 ends_with

文章目錄

    • 一、背景與動機
    • 二、string::starts_with 和 string::ends_with
      • (一)語法與功能
      • (二)使用示例
        • 1\. 判斷字符串開頭
        • 2\. 判斷字符串結尾
      • (三)優勢
    • 三、string_view::starts_with 和 string_view::ends_with
      • (一)語法與功能
      • (二)使用示例
        • 1\. 判斷字符串開頭
        • 2\. 判斷字符串結尾
      • (三)優勢
    • 四、實踐案例
      • (一)文件名處理
      • (二)HTTP 請求解析
    • 五、注意事項
    • 六、總結

在現代編程中,字符串操作是程序開發中不可或缺的一部分。C++20 標準的引入為字符串處理帶來了諸多便捷功能,其中 std::stringstd::string_viewstarts_withends_with 方法尤為引人注目。這些方法不僅簡化了代碼,還提高了可讀性和效率。本文將通過實際示例,深入探討這些方法的使用場景和優勢。

一、背景與動機

在 C++20 之前,判斷一個字符串是否以某個特定的子串開頭或結尾通常需要編寫復雜的邏輯代碼。例如,我們可能需要使用 std::string::substrstd::string::find 方法來實現類似功能,但這些方法不僅代碼冗長,而且容易出錯。C++20 的 starts_withends_with 方法正是為了解決這些問題而設計的。

二、string::starts_with 和 string::ends_with

(一)語法與功能

std::string::starts_withstd::string::ends_with 是 C++20 新增的成員函數,它們分別用于判斷字符串是否以指定的字符或子串開頭或結尾。其語法如下:

bool starts_with(char c) const noexcept;
bool starts_with(const char* s) const noexcept;
bool starts_with(const std::string& str) const noexcept;bool ends_with(char c) const noexcept;
bool ends_with(const char* s) const noexcept;
bool ends_with(const std::string& str) const noexcept;

這些方法支持多種參數類型,包括單個字符、C 風格字符串和 std::string 對象,為開發者提供了極大的靈活性。

(二)使用示例

1. 判斷字符串開頭
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";if (str.starts_with("Hello")) {std::cout << "The string starts with 'Hello'" << std::endl;}if (str.starts_with('H')) {std::cout << "The string starts with 'H'" << std::endl;}return 0;
}

輸出結果為:

The string starts with 'Hello'
The string starts with 'H'
2. 判斷字符串結尾
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";if (str.ends_with("!")) {std::cout << "The string ends with '!'" << std::endl;}if (str.ends_with("World!")) {std::cout << "The string ends with 'World!'" << std::endl;}return 0;
}

輸出結果為:

The string ends with '!'
The string ends with 'World!'

(三)優勢

  1. 簡潔性:相比傳統的字符串操作方法,starts_withends_with 提供了更簡潔的語法,減少了代碼量。
  2. 可讀性:方法名稱直觀地表達了其功能,使得代碼更易于理解和維護。
  3. 效率:這些方法經過優化,能夠高效地處理字符串匹配操作。

三、string_view::starts_with 和 string_view::ends_with

(一)語法與功能

std::string_view 是 C++17 引入的輕量級字符串類,它提供了一種高效的方式處理字符串數據。C++20 為 std::string_view 添加了與 std::string 相同的 starts_withends_with 方法,其語法如下:

bool starts_with(char c) const noexcept;
bool starts_with(const char* s) const noexcept;
bool starts_with(const std::string_view& sv) const noexcept;bool ends_with(char c) const noexcept;
bool ends_with(const char* s) const noexcept;
bool ends_with(const std::string_view& sv) const noexcept;

這些方法與 std::string 的版本類似,但它們專門針對 std::string_view 設計,進一步提升了性能。

(二)使用示例

1. 判斷字符串開頭
#include <iostream>
#include <string_view>int main() {std::string_view sv = "Hello, World!";if (sv.starts_with("Hello")) {std::cout << "The string view starts with 'Hello'" << std::endl;}if (sv.starts_with('H')) {std::cout << "The string view starts with 'H'" << std::endl;}return 0;
}

輸出結果為:

The string view starts with 'Hello'
The string view starts with 'H'
2. 判斷字符串結尾
#include <iostream>
#include <string_view>int main() {std::string_view sv = "Hello, World!";if (sv.ends_with("!")) {std::cout << "The string view ends with '!'" << std::endl;}if (sv.ends_with("World!")) {std::cout << "The string view ends with 'World!'" << std::endl;}return 0;
}

輸出結果為:

The string view ends with '!'
The string view ends with 'World!'

(三)優勢

  1. 性能優勢std::string_view 不會復制字符串數據,而是直接引用原始字符串。因此,在使用 starts_withends_with 方法時,不會產生額外的內存分配和復制開銷。
  2. 靈活性std::string_view 可以與 std::string 無縫配合,使得代碼更加靈活。

四、實踐案例

(一)文件名處理

假設我們正在開發一個文件處理程序,需要判斷文件名是否以特定的擴展名結尾。使用 ends_with 方法可以輕松實現這一功能:

#include <iostream>
#include <string>bool isImageFile(const std::string& filename) {return filename.ends_with(".jpg") || filename.ends_with(".png") || filename.ends_with(".gif");
}int main() {std::string filename = "example.jpg";if (isImageFile(filename)) {std::cout << filename << " is an image file." << std::endl;} else {std::cout << filename << " is not an image file." << std::endl;}return 0;
}

輸出結果為:

example.jpg is an image file.

(二)HTTP 請求解析

在解析 HTTP 請求時,我們可能需要判斷請求路徑是否以特定的前綴開頭。使用 starts_with 方法可以方便地實現這一功能:

#include <iostream>
#include <string>bool isApiRequest(const std::string& path) {return path.starts_with("/api/");
}int main() {std::string path = "/api/users";if (isApiRequest(path)) {std::cout << path << " is an API request." << std::endl;} else {std::cout << path << " is not an API request." << std::endl;}return 0;
}

輸出結果為:

/api/users is an API request.

五、注意事項

  1. 空字符串處理:如果目標字符串為空,starts_withends_with 方法會返回 false
  2. 參數類型匹配:在使用 starts_withends_with 方法時,需要注意參數類型與目標字符串類型的一致性。例如,不要將 std::string 對象傳遞給 std::string_view 的方法。
  3. 性能優化:雖然 std::string_view 提供了更高的性能,但在某些場景下,可能需要將 std::string_view 轉換為 std::string。此時需要注意內存分配和復制的開銷。

六、總結

C++20 的 std::string::starts_withstd::string::ends_withstd::string_view::starts_withstd::string_view::ends_with 方法為字符串處理帶來了極大的便利。它們不僅簡化了代碼,提高了可讀性,還提升了性能。在實際開發中,合理使用這些方法可以顯著提高開發效率和代碼質量。希望本文的介紹和實踐案例能夠幫助你更好地理解和應用這些功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73130.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能飛鳥監測 守護高壓線安全

飛鳥檢測新紀元&#xff1a;視覺分析技術的革新應用 在現代化社會中&#xff0c;飛鳥檢測成為了多個領域不可忽視的重要環節。無論是高壓線下的安全監測、工廠內的生產秩序維護&#xff0c;還是農業區的作物保護&#xff0c;飛鳥檢測都扮演著至關重要的角色。傳統的人工檢測方…

ADC噪聲全面分析 -04- 有效噪聲帶寬簡介

為什么要了解ENBW&#xff1f; 了解模數轉換器 (ADC) 噪聲可能具有挑戰性&#xff0c;即使對于最有經驗的模擬設計人員也是如此。 Delta-sigma ADC 具有量化和熱噪聲的組合&#xff0c;這取決于 ADC 的分辨率、參考電壓和輸出數據速率 (ODR)。 在系統級別&#xff0c;額外的信…

STM32單片機uCOS-Ⅲ系統10 內存管理

目錄 一、內存管理的基本概念 二、內存管理的運作機制 三、內存管理的應用場景 四、內存管理函數接口講解 1、內存池創建函數 OSMemCreate() 2、內存申請函數 OSMemGet() 3、內存釋放函數 OSMemPut() 五、實現 一、內存管理的基本概念 在計算系統中&#xff0c;變量、中…

考研課程安排(自用)

文章目錄 408數據結構&#xff08;王道&#xff09;計算機組成原理&#xff08;王道&#xff09;操作系統&#xff08;王道&#xff09;計算機網絡&#xff08;湖科大版&#xff09; 數學一高等數學&#xff08;微積分&#xff09;線性代數和概率論 408 數據結構&#xff08;王…

ultraiso制作u盤啟動

UltraISO制作U盤啟動盤的方法 UltraISO是一款功能強大的工具&#xff0c;可以幫助用戶將ISO鏡像文件寫入U盤&#xff0c;從而制作成可啟動的系統安裝盤。以下是詳細的步驟和注意事項&#xff1a; 1. ?準備工作? ?硬件準備?&#xff1a;一個容量至少為8GB的U盤&#xff0…

C語言-發布訂閱模式詳解與實踐

文章目錄 C語言發布訂閱模式詳解與實踐1. 什么是發布訂閱模式&#xff1f;2. 為什么需要發布訂閱模式&#xff1f;3. 實際應用場景4. 代碼實現4.1 UML 關系圖4.2 頭文件 (pubsub.h)4.3 實現文件 (pubsub.c)4.4 使用示例 (main.c) 5. 代碼分析5.1 關鍵設計點5.2 實現特點 6. 編譯…

藍橋杯2023年第十四屆省賽真題-異或和之差

題目來自DOTCPP&#xff1a; 思路&#xff1a; 什么是異或和&#xff1f; ①題目要求我們選擇兩個不相交的子段&#xff0c;我們可以枚舉一個分界線i&#xff0c;子段1在 i 的左邊&#xff0c; 子段2在 i 的右邊&#xff0c;分別找到子段1和子段2的最大值、最小值。 ②怎么確…

Linux作業2——有關文件系統權限的練習

1、創建/www目錄&#xff0c;在/www目錄下新建name和https目錄&#xff0c;在name和https目錄下分別創建一個index.html文件&#xff0c;name下面的index.html文件中包含當前主機的主機名&#xff0c;https目錄下的index.html文件中包含當前主機的ip地址。 #創建/www目錄&…

leeCode 70. 爬樓梯

假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢&#xff1f; 示例 1&#xff1a; 輸入&#xff1a;n 2 輸出&#xff1a;2 解釋&#xff1a;有兩種方法可以爬到樓頂。 1. 1 階 1 階 2. 2 階 示例 2&#x…

算法題(105):小貓爬山

審題&#xff1a; 本題需要我們找出將n個小貓放在有限重的纜車上運下山所需的最小纜車數 時間復雜度分析&#xff1a;本題的數據量小于等于18&#xff0c;所以我們在做好剪枝的前提下可以使用深度優先搜索解題 思路&#xff1a; 方法一&#xff1a;dfs 搜索策略&#xff1a;將小…

第十六章:Specialization and Overloading_《C++ Templates》notes

Specialization and Overloading 一、模板特化與重載的核心概念二、代碼實戰與測試用例三、關鍵知識點總結四、進階技巧五、實踐建議多選題設計題代碼測試說明 一、模板特化與重載的核心概念 函數模板重載 (Function Template Overloading) // 基礎模板 template<typename…

多協議兼容+高并發處理:EasyCVR如何破解AI安防規模化落地難題?

隨著AI技術在安防領域的深入應用&#xff0c;規模化部署面臨兩大核心挑戰&#xff1a;設備協議碎片化導致的接入壁壘與海量視頻流并發帶來的性能瓶頸。TSINGSEE青犀視頻的EasyCVR平臺通過“多協議兼容高并發處理”雙引擎驅動&#xff0c;結合云邊端協同架構與智能算法優化&…

IntelliJ IDEA 中 Git 高頻問題與操作詳解|新手避坑指南

標簽&#xff1a;IntelliJ IDEA Git操作, Git教程, 版本控制, 沖突解決, 分支管理 引言 你是否遇到過這些問題&#xff1f; 代碼提交后想撤銷怎么辦&#xff1f;合并分支時沖突不會解決&#xff1f;不小心把錯誤代碼推送到遠程倉庫&#xff1f; 本文針對 IntelliJ IDEA 中 Git …

【聊聊層次式架構設計:像搭樂高一樣構建軟件大廈】

文章目錄 聊聊層次式架構設計&#xff1a;像搭樂高一樣構建軟件大廈理論篇&#xff1a;層次式架構的“千層套路”最底層&#xff1a;基礎設施層——默默付出的“基石俠”數據訪問層&#xff1a;“數據快遞員”業務邏輯層&#xff1a;智慧的“大腦中樞”表示層&#xff1a;軟件的…

N列股票收盤價為起點的馬科維茨(Markowitz)均值—方差理論

1. 數據準備與收益率計算 輸入數據&#xff1a; 假設你有一個矩陣&#xff0c;每一列代表一只股票的歷史收盤價序列。每一行對應一個時間點的收盤價。 計算收益率&#xff1a; 馬科維茨理論要求使用資產的收益率而非價格。常用的收益率計算方法有對數收益率或簡單收益率。 2.…

Conda常用命令匯總(持續更新中)

原文章&#xff1a;安裝和使用Miniconda來管理Python環境-CSDN博客 一、Miniconda的使用 Miniconda沒有GUI界面&#xff0c;只能通過conda命令對Python環境和軟件包進行管理&#xff0c;所以這里主要介紹一下conda的常用命令。 1. Conda相關 (1)查詢conda版本 conda --vers…

Redis Cluster 詳解

Redis Cluster 詳解 1. 為什么需要 Redis Cluster&#xff1f; Redis 作為一個高性能的內存數據庫&#xff0c;在單機模式下可能會遇到以下問題&#xff1a; 單機容量受限&#xff1a;Redis 是基于內存存儲的&#xff0c;單機的內存資源有限&#xff0c;單實例的 Redis 只能…

利用 MATLAB/Simulink 建立完整的控制系統模型,并進行階躍響應和負載擾動響應仿真

-利用 MATLAB/Simulink 建立完整的控制系統模型,包括單一控制回路(電流、速度、位置)和整個系統的級聯模型 仿真任務包括驗證各回路的階躍響應、負載擾動響應等,確保系統在動態性能上滿足設計要求。 以下是在MATLAB/Simulink中建立完整控制系統模型(包含單一控制回路和級聯…

python基于spark的心臟病患分類及可視化(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;汽車數據分析平臺當然不能排除在外。本次我所開發的心臟病患分類及可視化系統是在實際應用和軟件工程的開發原理之上&#xff0c;運用Pyth…

3.milvus索引-HNSW

索引作用 加速大型數據集上的查詢。 向量字段&#xff0c;僅只能創建一個索引。 milvus支持的向量索引類型大部分使用 近似最近鄰搜索算法。ANNS該算法的核心不局限于返回最準確的結果&#xff0c;而是僅搜索目標的鄰居。ANNS通過在可接受的范圍內犧牲準確性提高檢索效率。 …